我在数据库中有以下内容(我将它们用作模型):
Category
{
long id;
string name;
long subcategoryId;
}
Subcategory
{
long id;
string subName;
//other data
}
我使用Entity SQL从db获取数据,如:
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);
}
我可以编辑有关此类别的一些信息,其中包含所选的子类别。问题是我在这个EditCategory Action中继续将model = null作为参数。我究竟做错了什么?欢迎任何建议。
答案 0 :(得分:2)
您无法使用GET作为操作链接传递复杂对象。如果你想这样做,你需要逐个发送所有属性并保留默认的模型绑定器,但这可能非常繁琐:
<%: Html.ActionLink(
"Move to new category",
"editcategory",
"category",
new {
prop1 = item.Prop1,
prop2 = item.Prop2,
...
},
null
)%>
我建议您使用标准方法来传递您愿意编辑的类别ID:
<%: 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操作可以将Category模型作为操作参数:
[HttpPost]
public ActionResult EditCategory(Category category)
{
if (!ModelState.IsValid)
{
return View(model);
}
// some code to update the category
return RedirectToAction("Success");
}
答案 1 :(得分:1)
您可能想重新考虑如何将此对象传递到操作链接并从控制器中加载数据
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)%>