Как передать сложные данные как модель из представления в контроллер в MVC 2 - PullRequest
2 голосов
/ 20 мая 2011

У меня есть в базе данных (и я использую их как модели):

Category
{
long id;
string name;
long subcategoryId;
}

Subcategory
{
long id;
string subName;
//other data
}

Я получаю данные из БД с помощью Entity SQL, например:

public static Category GetCategory(long catId)
        {
            Category cat;
            using (Entities db = new Entities())
            {
                cat = (from c in db.Categories
                       where c.id == catId
                       select c).SingleOrDefault();

                cat.SubcategoryReference.Load();
            }
            return cat;
        }

Теперь у меня есть частичное представление:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Test.Database.Subcategory>>" %>
<%--Some code--%>
<%:Html.ActionLink("Move to new category", "editcategory", "category",
                                             new { model = new Category { Subcategory = item } }, null)%>

План состоит в том, чтобы перейти с этой ссылкой действия на CategoryController и действием

public ActionResult EditCategory(Category model)
        {
            //some code
            return View(model);
        }

где я могу редактировать некоторую информацию об этой категории, которая будет содержать выбранную подкатегорию. Проблема в том, что я продолжаю получать model = null в качестве параметра в этом действии EditCategory. Что я делаю неправильно? Любой совет приветствуется.

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

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

<%: Html.ActionLink(
    "Move to new category", 
    "editcategory", 
    "category",
    new { 
        prop1 = item.Prop1,
        prop2 = item.Prop2,
        ...
    }, 
    null
)%>

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

<%: Html.ActionLink(
    "Move to new category", 
    "editcategory", 
    "category",
    new { id = item.Id }, 
    null
) %>

и внутри действия контроллера извлеките соответствующую модель из хранилища:

public ActionResult EditCategory(int id)
{
    Category model = ... fetch category from id
    //some code
    return View(model);
}

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

[HttpPost]
public ActionResult EditCategory(Category category)
{
    if (!ModelState.IsValid) 
    {
        return View(model);
    }
    // some code to update the category
    return RedirectToAction("Success");
}
1 голос
/ 20 мая 2011

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

public ActionResult EditCategory(long id)
{
    Category model = id > 0 
        ? GetCategory(long id)
        : new Category() { Subcategory = item };

    return View(model);
}

[HttpPost]
public ActionResult EditCategory(int id, Category category)
{
    if (ModelState.IsValid) { /* save then redirect */ }
    return View();

}

и создайте ссылки для действий следующим образом:

<%:Html.ActionLink("Move to new category", 
    "editcategory", "category", new { id = 0 }, null)%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...