将参数传递给 Url.Action 方法有问题
Something wrong with passing parameter to Url.Action method
我正在尝试通过 ajax 编写更新功能。
这些是我的控制器方法:
[ActionName("UpdatePhoto"), HttpPost]
public ActionResult UpdatePhotoPostViewModel(PhotoViewModel photo)
{
if (!ModelState.IsValid)
return PartialView("UpdatePhoto", photo);
TempData["Photo"] = photo;
return Json(new { success = true });
}
[ActionName("UpdatePhoto"), HttpGet]
public ActionResult UpdatePhotoGetViewModel(PhotoViewModel photo)
{
if (TempData["Photo"] != null)
photo = TempData["Photo"] as PhotoViewModel;
return PartialView(photo);
}
public ActionResult Photo(PhotoViewModel photo)
{
if (TempData["Photo"] != null)
photo = TempData["Photo"] as PhotoViewModel;
return PartialView("PhotoSummary", photo);
}
}
并查看 类:
//PhotoSummary
@model PhotoAlbum.WEB.Models.PhotoViewModel
<div class="well">
<h3>
<strong>@Model.Name</strong>
<span class="pull-right label label-primary">@Model.AverageRaiting.ToString("# stars")</span>
</h3>
<span class="lead">@Model.Description</span>
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", new {photo = @Model}), "Update Photo", @Model.PhotoId.ToString(), Url.Action("Photo"))
</div>
//Main View
@model PhotoAlbum.WEB.Models.PhotoListViewModel
@{
ViewBag.Title = "My Photos";
}
@foreach (var p in @Model.Photos)
{
<div id=@p.PhotoId.ToString()>
@Html.Action("Photo", new {photo = p})
</div>
}
这是我的 DialogFormLink 助手:
public static MvcHtmlString DialogFormLink(this HtmlHelper htmlHelper, string linkText, string dialogContentUrl,
string dialogTitle, string updateTargetId, string updateUrl)
{
TagBuilder builder = new TagBuilder("a");
builder.SetInnerText(linkText);
builder.Attributes.Add("href", dialogContentUrl);
builder.Attributes.Add("data-dialog-title", dialogTitle);
builder.Attributes.Add("data-update-target-id", updateTargetId);
builder.Attributes.Add("data-update-url", updateUrl);
builder.AddCssClass("dialogLink");
return new MvcHtmlString(builder.ToString());
}
问题是 UpdatePhotoGetViewModel
方法中的对象照片是 null
。
但是我这里传了模型:
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", **new {photo = @Model}**), "Update Photo", @Model.PhotoId.ToString(), Url.Action("Photo"))
为什么没有注入这个参数?
为了将模型传回 GET 方法,您的代码需要
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", Model), "Update Photo", ....)
但是,通常您不应该这样做,原因如下
- 它创建了一个丑陋的查询字符串
- 它生成的查询字符串可能超过查询字符串
限制和抛出异常
- 如果您的模型包含任何复杂对象的属性或
集合,模型绑定将失败,这些属性将
空
相反,您应该将模型的 ID 传递给 GET 方法,并从您的存储库(数据库、会话等)获取模型,例如
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", new { id = Model.ID }), "Update Photo", ....)
并在控制器中
public ActionResult UpdatePhoto(int ID)
我正在尝试通过 ajax 编写更新功能。 这些是我的控制器方法:
[ActionName("UpdatePhoto"), HttpPost]
public ActionResult UpdatePhotoPostViewModel(PhotoViewModel photo)
{
if (!ModelState.IsValid)
return PartialView("UpdatePhoto", photo);
TempData["Photo"] = photo;
return Json(new { success = true });
}
[ActionName("UpdatePhoto"), HttpGet]
public ActionResult UpdatePhotoGetViewModel(PhotoViewModel photo)
{
if (TempData["Photo"] != null)
photo = TempData["Photo"] as PhotoViewModel;
return PartialView(photo);
}
public ActionResult Photo(PhotoViewModel photo)
{
if (TempData["Photo"] != null)
photo = TempData["Photo"] as PhotoViewModel;
return PartialView("PhotoSummary", photo);
}
}
并查看 类:
//PhotoSummary
@model PhotoAlbum.WEB.Models.PhotoViewModel
<div class="well">
<h3>
<strong>@Model.Name</strong>
<span class="pull-right label label-primary">@Model.AverageRaiting.ToString("# stars")</span>
</h3>
<span class="lead">@Model.Description</span>
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", new {photo = @Model}), "Update Photo", @Model.PhotoId.ToString(), Url.Action("Photo"))
</div>
//Main View
@model PhotoAlbum.WEB.Models.PhotoListViewModel
@{
ViewBag.Title = "My Photos";
}
@foreach (var p in @Model.Photos)
{
<div id=@p.PhotoId.ToString()>
@Html.Action("Photo", new {photo = p})
</div>
}
这是我的 DialogFormLink 助手:
public static MvcHtmlString DialogFormLink(this HtmlHelper htmlHelper, string linkText, string dialogContentUrl,
string dialogTitle, string updateTargetId, string updateUrl)
{
TagBuilder builder = new TagBuilder("a");
builder.SetInnerText(linkText);
builder.Attributes.Add("href", dialogContentUrl);
builder.Attributes.Add("data-dialog-title", dialogTitle);
builder.Attributes.Add("data-update-target-id", updateTargetId);
builder.Attributes.Add("data-update-url", updateUrl);
builder.AddCssClass("dialogLink");
return new MvcHtmlString(builder.ToString());
}
问题是 UpdatePhotoGetViewModel
方法中的对象照片是 null
。
但是我这里传了模型:
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", **new {photo = @Model}**), "Update Photo", @Model.PhotoId.ToString(), Url.Action("Photo"))
为什么没有注入这个参数?
为了将模型传回 GET 方法,您的代码需要
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", Model), "Update Photo", ....)
但是,通常您不应该这样做,原因如下
- 它创建了一个丑陋的查询字符串
- 它生成的查询字符串可能超过查询字符串 限制和抛出异常
- 如果您的模型包含任何复杂对象的属性或 集合,模型绑定将失败,这些属性将 空
相反,您应该将模型的 ID 传递给 GET 方法,并从您的存储库(数据库、会话等)获取模型,例如
@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", new { id = Model.ID }), "Update Photo", ....)
并在控制器中
public ActionResult UpdatePhoto(int ID)