Передача данных из контроллера в представление пользовательского элемента управления с ASP.NET MVC - PullRequest
1 голос
/ 31 декабря 2008

У меня есть класс View (OrderView.aspx), который показывает детали заказа (имя учетной записи, дата заказа), а также список строк заказа с помощью элемента управления Repeater. Каждая строка заказа представлена ​​в виде пользовательского элемента управления (OrderLineView.ascx), который показывает детали строки заказа (наименование товара, количество, цена). У меня есть объект модели с именем Order, который я использую в качестве источника данных для всего этого, который я передаю в качестве объекта модели для представления.

Каждый пользовательский элемент управления OrderLineView имеет кнопки Сохранить и Удалить. У меня есть кнопка Сохранить, которая отправляет содержимое формы в элементе управления OrderLine в метод Save на контроллере, а затем на RedirectToAction возвращается на ту же страницу заказа (это обновляет всю страницу, ничего об этом не сообщая). У меня есть кнопка Удалить, ссылающаяся на метод на контроллере, который пытается удалить, а затем RedirectToAction обратно на ту же страницу заказа. Однако, если удаление не удается, я хочу, чтобы небольшое сообщение об ошибке отображалось рядом с кнопкой удаления при повторном отображении страницы (помните, что для каждой строки заказа на странице есть кнопка удаления, поэтому я хочу только сообщение рядом с тот, который я нажал). Мои вопросы:

1 - Как передать эти данные из моего метода контроллера в определенный пользовательский элемент управления? Должен ли я как-то добавить его в модель? Похоже, плохая идея (так как она действительно не является частью модели).

2 - Должен ли я иметь OrderLineController для операций OrderLine, а также OrderController для операций Order? Я просто хочу знать, рекомендуется ли иметь отдельный контроллер для каждого представления.

3 - Я видел, как некоторые люди могут вызывать RedirectToAction со значением анонимного типа, например:

RedirectToAction("ViewOrder", new { Id = 1234, Message = "blabla"});

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

4 - Кроме того, для доступа к свойствам Модели из представления я постоянно делаю это:

foo(((someModelType) this.ViewData.Model).SomeProperty);

Мне это не нравится по ряду причин, одной из которых является то, что я не хочу, чтобы мое представление связывалось с типом моей модели (именно поэтому я использую ViewPage вместо ViewPage) , Я бы предпочел, чтобы у меня был такой звонок:

foo(ModelEval("SomeProperty"));

Есть ли такая вещь? Я написал свой, но хотел бы, если бы мне не пришлось.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2008

1

Проверьте ModelState.

ViewData.ModelState.AddModelError("something.Name", "Please enter a valid Name");

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

ViewData.ModelState.AddModelError("something#3.Name", "Please enter a valid Name");

и, на ваш взгляд, вы можете поставить

<%= Html.ValidationMessage(string.format({"something{0}.Name", YourUniqueId))%>

4

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

1 голос
/ 31 декабря 2008

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

public ActionResult Delete(int? Id)
{
    ModelState.AddModelError("OrderLine" + Id.Value, "Error deleting OrderLine# " + Id.Value);

    ...    
}

, а затем используйте помощник ValidatinoMessage. Это проверит ModelState, чтобы увидеть, существует ли ошибка, и если она это сделает, то отобразит сообщение. В противном случае это пусто.

<%= Html.ValidationMessage ("OrderLine" + Id)%>

В следующем выпуске MVC Model станет свойством верхнего уровня, поэтому следующее

foo(((someModelType) this.ViewData.Model).SomeProperty);

можно записать как

foo(Model.SomeProperty);

Объекты модели уже должны быть напечатаны, если вы не используете открытый объект в качестве свойства?

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