Повторное использование действия ASP.NET MVC с другим префиксом?

У меня есть это действие:

public ActionResult AddCategory(Category newCategory)
{
    ...//newCategory.Name is filled up
    return new Json(true);
}

И просмотреть этот пост в этом действии:

@using(Html.BeginForm)
{
@Html.TextBoxFor(Model.Name)
.....
}

Теперь я хочу повторно использовать это действие, но на другой странице. Но в этом новом представлении у меня уже есть Html.TextBox («имя») в другом. Это своего рода DashBoard.

Этот новый вид имеет свойство NewCategory внутри модели:

public class MyViewModel
{
    public Category NewCategory{get;set;}
}

Если я сделаю это:

@using(Ajax.BeginForm)
{
    @Html.TextBoxFor(Model.NewCategory.Name)
    .....
}

Не сработает, потому что мое действие не ожидает никакого префикса, в данном случае NewCategory.

Конечно, я могу вручную вызвать Action, но при этом я потерял встроенную проверку (я использую DataAnnotation с ненавязчивой проверкой).

Это сценарий, что я время от времени падаю

Лучший выбор, который у меня есть сейчас, - это продублировать действие:

public ActionResult AddCategory([Bind(Prefix="NewCategory")]Category category)
{
    ...
    return new Json(true);
}

person Felipe Pessoto    schedule 08.06.2011    source источник
comment
ваша проблема в том, что вы хотите, чтобы встроенная проверка mvc работала в частичных представлениях   -  person Rajesh    schedule 08.06.2011


Ответы (3)


Вызовите Html.RenderAction, чтобы повторно использовать результат действия в других представлениях, и передайте ему параметр имени для вашей модели, например:

Используйте Html.RenderAction ("AddCategory", новый {name = Model.CategoryName})

person Evgeny Levin    schedule 08.06.2011
comment
когда в его модели есть NewCategory, зачем ему снова выполнять результат действия. Разве не уместно просто вызвать RenderPartial и передать Model.NewCategory в качестве модели - person Muhammad Adeel Zahid; 08.06.2011
comment
@Muhammad, если его представление для категории не требует каких-либо специальных данных (которые передаются через ViewBag / ViewData / TempData из действия), кроме модели - использование RenderPartial является правильным вариантом. Прошу прощения за отрицательный голос, отредактируйте сообщение, пожалуйста. - person Evgeny Levin; 08.06.2011
comment
Я хочу сделать что-то вроде того, что вы сказали, но я не хочу отображать действие, я хочу вызвать это действие через запрос, просто чтобы сохранить категорию. AddCategory возвращает Json (true) - person Felipe Pessoto; 08.06.2011
comment
@Fujiy сложно говорить о вашей задаче, потому что я не знаю: 1. есть ли в вашем CategoryView форма 2. если есть в другом представлении (при этом вы хотите повторно использовать CategoryiIew), или это просто отображение представления 3 Какую проверку вы используете: по атрибутам использования другим способом. Пожалуйста, обновите вопрос, указав эти детали, чтобы объяснить, чего вы действительно хотите. Попробуйте описать сценарии. - person Evgeny Levin; 08.06.2011

Решение состоит в том, чтобы создать другой метод с «таким же» назначением:

[ActionName("AddCategory")]
public ActionResult AddCategory2([Bind(Prefix="NewCategory2")]Category category)
{
    ...
    return new Json(true);
}
person Felipe Pessoto    schedule 24.02.2012

что я понимаю из вашего вопроса, так это то, что вы находитесь в некотором представлении X и хотите отобразить представление AddCategory внутри этого представления, а модель представления X содержит NewCategory, который имеет тип Category и принят AddCategory View в качестве модели. если это так, вам просто нужно вызвать частичный рендеринг в своем представлении X

<%Html.RenderPartial("AddCategory", Model.NewCategory);%>
person Muhammad Adeel Zahid    schedule 08.06.2011