Значения формы MVC 2 не публикуются - PullRequest
0 голосов
/ 07 октября 2010

Привет всем Я пытаюсь изучить MVC 2, ASP и т. Д. Через музыкальный магазин MVC. В то же время я пытаюсь согласовать то, что он делает, с решением, которое я разрабатываю на работе. Общая структура системы заявок службы технической поддержки IT, и я работаю над очень широкими функциями администратора по созданию, редактированию и удалению заявок. Я очень внимательно следил за руководством, но попал в кирпичную стену, пытаясь использовать значения, которые должны быть опубликованы в методах контроллера, а они не достигают этого.

Для раздела создания мой create.aspx выглядит как

<h2>Create</h2>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Create New Request</legend>
        <%: Html.EditorFor(model => model.request,
               new {Softwares = Model.SoftwareName, Systems = Model.SystemIDNo}) %>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>

частичное представление его вызова: workRequest.ascx

<p> 
    <%= Html.LabelFor(model => model.Medium)%> 
    <%= Html.TextBoxFor(model => model.Medium)%>
    <%= Html.ValidationMessageFor(model => model.Medium)%> 
</p> 
<p> 
    <%= Html.LabelFor(model => model.Summary)%> 
    <%= Html.TextBoxFor(model => model.Summary)%> 
    <%= Html.ValidationMessageFor(model => model.Summary)%> 
</p> 
<p> 
    <%= Html.LabelFor(model => model.Details)%> 
    <%= Html.TextAreaFor(model => model.Details)%> 
    <%= Html.ValidationMessageFor(model => model.Details)%> 
</p>
<p> 
    <%= Html.LabelFor(model => model.WorkHalted)%> 
    <%= Html.TextBoxFor(model => model.WorkHalted)%>  
    <%= Html.ValidationMessageFor(model => model.WorkHalted)%> 
</p>
<p> 
    <%= Html.LabelFor(model => model.Frequency)%> 
    <%= Html.TextBoxFor(model => model.Frequency)%>
    <%= Html.ValidationMessageFor(model => model.Frequency)%> 
</p>
<p> 
    <%= Html.LabelFor(model => model.StartDate)%> 
    <%= Html.TextBoxFor(model => model.StartDate, String.Format("{0:g}", Model.StartDate))%> 
    <%= Html.ValidationMessageFor(model => model.StartDate)%> 
</p>
<p>
    <%= Html.LabelFor(model => model.SoftwareID) %>
    <%= Html.DropDownList("SoftwareID", new SelectList(ViewData["Softwares"] as IEnumerable, Model.SoftwareID)) %>
</p>
<p>
    <%= Html.LabelFor(model => model.SystemID) %>
    <%= Html.DropDownList("SystemID", new SelectList(ViewData["Systems"] as IEnumerable, Model.SystemID)) %>
</p>

и контроллер создания записи выглядит как

[HttpPost]
    public ActionResult Create(WorkRequest newRequest)
    {
        try
        {
            storeDB.AddToWorkRequests(newRequest);
            storeDB.SaveChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }

    }

Я поставил точку останова в попытке и проверил значения, поступающие в newRequest, и все в newRequest равно нулю, как будто ничего не передается.

Аналогичная ситуация возникает и на стороне редактирования, вообще ничего не отправляется из частичного представления в контроллер.

В любом случае, я уверен, что это что-то довольно простое, я новичок в MVC, ASP, C #, почти во всем этом. Обычно я многого не спрашиваю у других, но я уже давно смотрю на эту проблему и могу взглянуть на нее свежо.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

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

public ActionResult Create(WorkRequest request)

Причина этого - имя публикуемых значений.Они выглядят примерно как RequestViewModel.Request.Summary, поэтому имя объекта запроса на самом деле Request.У объекта WorkRequest нет свойства Request, поэтому ничто не связывает.

Вы можете привязать объект, к которому привязан ваш вид, RequestViewModel, как предложил Дарин Димитров.

В качестве альтернативы, вы можете просто привязать запрос к своему назначению, вам просто нужно убедиться, что MVC знает, как связать значения.Он знает об этом только через соглашение об именах, поэтому, если вы связываете подобъект, вам нужно убедиться, что ваш параметр для действия назван так же, как и свойство его родительского объекта.

0 голосов
/ 07 октября 2010

Попробуйте использовать тот же тип модели представления, что и параметр, который вы использовали для визуализации представления и для которого он строго типизирован:

[HttpPost]
public ActionResult Create(ViewModelUsedToStronglyTypeTheView model)
{
    //model.request should be properly bound here
    try
    {
        storeDB.AddToWorkRequests(model.request);
        storeDB.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View(model);
    }
}

Или используя префикс:

[HttpPost]
public ActionResult Create([Bind(Prefix = "request")] WorkRequest newRequest)
{
    //model.request should be properly bound here
    try
    {
        storeDB.AddToWorkRequests(newRequest);
        storeDB.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...