2010-10-07 1 views
0

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

Для секции создать мой 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(); 
     } 

    } 

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

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

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

Заранее благодарен!

+0

какая самая первая строка на ваш взгляд, можете ли вы вставить это, пожалуйста? На самом деле вы можете публиковать ПОЛНЫЙ контент обоих представлений. –

ответ

0

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

[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(); 
    } 
} 
+0

Привет, добавлен префикс. Чтобы узнать больше, я просто хотел спросить, что делает добавление, которое делает то, что я раньше не делал, или что я делал неправильно? Просто пытаюсь понять все. – Mark

+0

Посмотрите на опубликованные значения, используя FireBug. Вы заметите, что все они имеют префикс «запрос». Вот как работают сильно типизированные помощники в шаблоне редактора: они генерируют поля ввода на основе выражения лямбда, которое вы предоставляете, и контекста. Поскольку вы работаете в контексте свойства 'request', все имеет префикс. Затем связующее устройство по умолчанию попытается связать запрос, но не может найти какой-либо параметр POST, который назван как свойства этого объекта, потому что все они имеют префикс. Будьте осторожны с этим, потому что если вы переименуете свое имущество. –

+0

О, ладно, я вижу, что я делаю, спасибо за быстрый ответ !! – Mark

0

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

public ActionResult Create(WorkRequest request) 

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

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

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

Смежные вопросы