Модель пуста? - PullRequest
       6

Модель пуста?

2 голосов
/ 10 декабря 2010

Я читал много похожих постов о нулевой модели, но мой случай очень очень прост, и все же модель действия «Создать» является нулевой.Что я делаю неправильно???

Вот ситуация: один основной вид, два строго типизированных частичных представления внутри, каждый из которых связан с публичным свойством основной модели.Любая помощь приветствуется. модели :

public class SimpleModel1
{
    public IEnumerable<string> SomeStrings1 { get; set; }
}

public class SimpleModel2
{
    public IEnumerable<string> SomeStrings2 { get; set; }
}

public class ComplexModel
{
    public SimpleModel1 model1 { get; set; }
    public SimpleModel2 model2 { get; set; }
    public IEnumerable<string> SomeStringsComplex { get; set; }
}

int контроллер :

public ActionResult Create()
    {
        ComplexModel complex = new ComplexModel();
        complex.model1 = new SimpleModel1();
        complex.model1.SomeStrings1 = new List<string> { "a1", "a2", "a3"};

        complex.model2 = new SimpleModel2();
        complex.model2.SomeStrings2 = new List<string> { "b1", "b2", "b3" };

        complex.SomeStringsComplex = new List<string> { "c1", "c2", "c3" };
        return View(complex);
    }

    [HttpPost]
    public ActionResult Create(ComplexModel model)
    {
        if (ModelState.IsValid)
        {
            var test = model.SomeStringsComplex;
        }
        return View();
    }

Просмотры : 2 сильных частичных просмотра - каждыйдля модели

<%@ Control Language="C#"     
Inherits="System.Web.Mvc.ViewUserControl<MvcApp1.Models.SimpleModel2>" %>

<fieldset>
    <legend>Fields</legend>
    <% foreach (string item in Model.SomeStrings2)
            {%>
            <p>
            <label for="Title">Item Title:</label>
            <%= Html.TextBox(item,item)%>               
            </p>
            <%
            }
         %>
</fieldset>

1 основной вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<MvcApp1.Models.ComplexModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Create</h2>
 <% using (Html.BeginForm()) {%>
 <fieldset>
<div> Own values
<% foreach (string item in Model.SomeStringsComplex)
            {%>
            <p>
            <label for="Title">Item Title:</label>
            <%= Html.TextBox(item,item) %>          
            </p>
            <%
            }
         %>
</div>
<div>Simple values 1
<%Html.RenderPartial("SimpleModelView1", this.ViewData.Model.model1, new ViewDataDictionary()); %>
</div>

<div>Simple values 2
<%Html.RenderPartial("SimpleModelView2", Model.model2, new ViewDataDictionary()); %>
</div>
<p>
            <input type="submit" value="Create" />
        </p>
</fieldset>
 <% } %>

Ответы [ 4 ]

2 голосов
/ 10 декабря 2010

Я собираюсь сделать дикий удар и сказать, что проверка вашей модели не удалась при отправке ComplexModel обратно на сервер

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

if (ModelState.IsValid)
{
    var test = model.SomeStringsComplex;
}
return View(); // View is called with no Model data

Судя по вашему коду, создание экземпляра представления Create с помощьюНет модели.Это можно исправить довольно просто:

[HttpPost]
public ActionResult Create(ComplexModel model)
{
    if (ModelState.IsValid)
    {
        var test = model.SomeStringsComplex;
        // Do something to Create the object

        RedirectToAction("Index");
    }

    // Model State is invalid, return so the user can correct
    return View(model);
}
1 голос
/ 10 декабря 2010

Разве вы не должны посылать что-то на просмотр в этой строке?

return View();
0 голосов
/ 20 декабря 2010

Наконец-то я нашел решение.Данные, отправленные в метод Create, должны выглядеть как s.th.как это:

[HttpPost]
public ActionResult Create(ComplexModel mainModel, SimpleModel nestedModel, SimpleModel2 nested2Model)
{
    if (ModelState.IsValid)
    {
        var main = mainModel;
        var nested1 = nestedModel;
        var nested2 = nested2Model;
    }

    return View();
}

Вложенные параметры не равны нулю, когда модели связаны с частичным представлением.Если используется в основной форме через основную модель, то значения находятся в случае основной модели.Я также изменил IEnumerable<string> на IList<string>, а затем обработал строковые значения с помощью

for (int i = 0; i < Model.Strings.Count; i++)
{ %>
    <%: Html.EditorFor(m => m.Strings[i])%>
<% }

Спасибо всем

0 голосов
/ 10 декабря 2010

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

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

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

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