Как передать модель из PartialView в контроллер - PullRequest
0 голосов
/ 20 марта 2012

У меня есть PaartialView, объявленный так:

@model IEnumerable<mvc1.Models.ProjectDetailModel>
@using (Html.BeginForm())         
<form method="get" action="EditProject" enctype="multipart/form-data">
<br />
<fieldset>
    <legend>Project Detail</legend>   
@foreach (var item in Model)
{
    <tr>
        <th class="thdetail">
            Project Code
        </th>
        <td class="tddetail">
            @Html.DisplayFor(modelItem => item.projectCode)
        </td>
        <tr>
        <th class="thdetail">
                Project Name
        </th>
        <td class="tddetail">
            @Html.DisplayFor(modelItem => item.projectName)
        </td>

        </tr>
        <tr>
            <th class="thdetail">
                Project Type
            </th>
            <td class="tddetail">
                @Html.DisplayFor(modelItem => item.projectType)
            </td>
        </tr>
        <tr>
            <th class="thdetail">
                Detailed Description
            </th>
            <td class="tddetail">
            <div style="height: 100px; width:700px; overflow: scroll">
                @Html.DisplayFor(modelItem => item.projectDescription)
            </div>
            </td>
        </tr>
    </table>
</fieldset>    
<input type="submit" value="Edit" /> 
</form>
}

На кнопке отправки я вызываю контроллер, но когда он поступает на контроллер, модель не передается обратно контроллеру.Как я могу вернуть модель обратно в контроллер, или даже просто в 1 поле, т.е.Model.projectCode, который является первичным ключом

В контроллере у меня есть fll, который берет модель и получает первичный ключ и вызывает хранимую процедуру для возврата результатов другому VIEW ()

    [HttpGet]
    public ActionResult EditProject(ProjectDetailModel model)
    {
        DBController dbcontroller = new DBController();

        string l_user_name = SessionBag.Current.UserName;
        Int64 l_project_code = model.projectCode;

        if (dbcontroller.DBConnection())
        {
            MySqlCommand command = new MySqlCommand("edit_projects",   dbcontroller.conn);
            command.CommandType = System.Data.CommandType.StoredProcedure;

            // Input parameters for the insert_projects STORED PROC
            command.Parameters.Add(new MySqlParameter("userName",  SessionBag.Current.UserName));
            command.Parameters["@userName"].Direction =   System.Data.ParameterDirection.Input;
            // Output parameters for the view_sr_projects_detail STORED PROC               
            command.Parameters.Add(new MySqlParameter("projectName", MySqlDbType.LongText));
            command.Parameters["@projectName"].Direction = System.Data.ParameterDirection.Output;

            command.Parameters.Add(new MySqlParameter("projectType", MySqlDbType.LongText));
            command.Parameters["@projectType"].Direction = System.Data.ParameterDirection.Output;

            command.Parameters.Add(new MySqlParameter("projectDescription", MySqlDbType.LongText));
            command.Parameters["@projectDescription"].Direction = System.Data.ParameterDirection.Output;
           try
            {
                MySqlDataReader rdr = command.ExecuteReader();

                var model1 = new ProjectDetailModel();

                while (rdr.Read())
                {
                    model1.projectCode = (Int64)(rdr["projectCode"]);
                    model1.projectName = rdr["projectName"].ToString();
                    model1.projectType = rdr["projectType"].ToString();
                    model1.projectDescription = rdr["projectDescription"].ToString();
                }

                dbcontroller.conn.Close();

                return View(model1);
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                dbcontroller.conn.Close();

                ViewBag.Message = "Could not view your detail project. Error " + ex.Number + " has ocurred. Please try again or contact the system administrator.";
                return View("Error");
            }
        }
        else
        {
            ViewBag.Message = "Could not connect to the database. Please try again or contact the system administrator";
            return View("Error");
        }
    }        

Моя модель выглядит так:

public class ProjectDetailModel
{
    [Display(Name = "Project Code")]
    public Int64 projectCode { get; set; }

    [Display(Name = "User Name")]
    public string srUserName { get; set; }

    [Display(Name = "Project Name")]
    public string projectName { get; set; }

    [Display(Name = "Project Type")]
    public string projectType { get; set; }

    [Display(Name = "Project Requirement")]
    public string projectDescription { get; set; }
}

public class ProjectDetailModelList : List<ProjectDetailModel>
{
}

спасибо Нарен

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Вот что вы можете сделать. Ниже приведен только частичный код, измените его, чтобы он соответствовал вашему примеру:

Код на ваш взгляд:

<button id="btnEdit" type="button">Edit</button>

Затем я использую jQuery, чтобы добавить слушатель щелчка к кнопке (убедитесь, что jQuery добавлен в представление):

<script>

     $(document).ready(function () {

          $('#btnEdit').click(function () {
               window.location = '@Url.RouteUrl(new { action = "EditProject", projectCode = Model.projectCode })';
          });

     });

</script>

Ваш метод действия:

public ActionResult EditProject(int projectCode)
{
     // Retrieve this specific project using this code
     // Do what needs to be done to populate the required input fields on view
}

Это лучший способ, который я нашел для этого.

0 голосов
/ 20 марта 2012

Когда MVC вызывает ваше действие controller.EditProject(ProjectDetailModel), система привязки пытается создать объект ProjectDetailModel из данных, размещенных на странице (или в строке запроса или данных маршрута и т. Д.).Чтобы создать и заполнить ProjectDetailModel для вас, вы должны иметь следующее:

  1. Конструктор без параметров в ProjectDetailModel
  2. Публично устанавливаемое свойство ссоответствующее значение в данных формы

Так что если ProjectDetailModel выглядит так:

public class ProjectDetailModel
{
    public ProjectDetailModel()
    {
    }

    public int ProjectId
    {
        get;
        set;
    }
}

... вы можете заполнить его MVC, разместив эту форму:

<form method="get" action="EditProject" enctype="multipart/form-data">
    <input type="hidden" id="ProjectId" name="ProjectId" value="123" />
</form>

Редактировать

Глядя на дополнительный код, который вы добавили к вопросу, у вас есть несколько вещей, которые нужно разобраться:

  1. @using (this.Html.BeginForm()) отобразит тег открытой формы - так как вы написали его вручную, вам не нужна эта строка.

  2. Использование this.Html.DisplayFor() просто напишет свойствозначение на экран;если вы хотите, чтобы он был введен в параметр в вашем действии, вам необходимо предоставить значения для системы привязки.Вы можете сделать это, используя EditorFor() вместо DisplayFor(), что приведет к тому, что они будут включены в запрос по мере его отправки в действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...