2015-01-28 2 views
1

У меня есть два класса, как это (чтобы сделать его простым)Razor: Обработка списка объектов в представлении, и проверки модели

public class Page 
{ 
    int pageNumber; 
    string content; 
} 

public class Book 
{ 
    public string name; 
    public List<Page> pages; 
} 

Теперь, в свете бритвы, у меня есть форма, позволяющая добавлять книгу со списком страниц в форме, чтобы добавить страницы.

В настоящее время страницы добавляются динамически в форму, и я получаю значения в своем контроллере с помощью Request.Form для создания моего списка страниц в контроллере. Проблема заключается в том, как я могу проверить модель со страницами (например, на странице должно быть не пустое содержимое), прежде чем вводить действие в контроллер.

Поля, добавленные JQuery в форму. Я думаю, что невозможно связать список страниц напрямую с моделью в представлении, особенно когда поля сгенерированы с помощью javascript. Но, может быть, я что-то упустил.

Благодаря

ответ

1

Вы можете использовать модель привязки в ASP.NET, даже если вы добавляете форму JQuery элементы, увидеть это, чтобы создать коллекции, которые являются обязательными для модели:

ASP.NET Wire Format for Model Binding to Arrays, Lists, Collections, Dictionaries

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

<input type="text" name="name"/> 
<input type="text" name="pages[0].pageNumber"/> 
<input type="text" name="pages[0].content" /> 
<input type="text" name="pages[1].pageNumber"/> 
<input type="text" name="pages[1].content"/> 
<input type="text" name="pages[3].pageNumber"/> 
<input type="text" name="pages[3].content"/> 

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

public ActionResult Create(Book myBook) 
    {} 

Затем, для проверки, я предлагаю вам те использовать аннотации данных для вашей модели используйте [Требуется] тег до свойства содержимого объекта страницы или [MinLenght], см. это Microsoft documentation о аннотациях данных.

[Required] 
public string Content { get; set; } 

Затем на ваш взгляд, используйте jquery.validate (не забудьте включить его в представлении) и в контроллере, когда вы получаете вашу модель, вы можете проверить ModelState с

public ActionResult Create(YourObject object) 
{ 
    if (ModelState.IsValid) 
    { 
      // code when model is valid 
    } 
} 
+0

Это то, что я искал! Спасибо, добрый сэр! –

+0

Avec plaisir! Я рекомендую использовать аннотацию данных во всей вашей модели данных. Если вам не удобно размещать аннотацию данных на вашем бизнес-объекте напрямую, вы можете создать своего рода модель вида, брата бизнес-объекта, брата, который принимает всю проверку, переводы и т. Д. Я обычно делаю это, и я добавляю некоторые поля в качестве списка для заполнения полей выбора и так далее. – clement

+0

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

1

вы можете проверить страницы в JQuery, прежде чем данные отправить на сервер.

или вы можете использовать фильтр. фильтр - это метод, который выполняется до выполнения действия. (возможно, вы видели или использовали фильтр [Авторизовать])

вы можете создать фильтр, который проверяет данные, и если проверка не удалась, запрос будет перенаправлен на страницу с ошибкой.

here is a tutorial

here is another tutorial

0

С помощью MVC вы можете использовать DataAnnotations для своих свойств модели.

Использование using System.ComponentModel.DataAnnotations;

public class Book{ 

    [Required] 
    public string Name{ get; set; } 

    public List<Page> Pages { get; set; } 
} 

public class Page{ 

    [Required] 
    public int PageNumber{ get; set; } 

    [Required] 
    public string Content { get; set; } 
} 

Для более глубокого понимания прочитать: http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

+0

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

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