【问题标题】:Something wrong with passing parameter to Url.Action method将参数传递给 Url.Action 方法有问题
【发布时间】:2015-12-17 07:32:30
【问题描述】:

我正在尝试通过 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"))

为什么没有注入这个参数?

【问题讨论】:

  • 什么是DialogFormLink()? (它不是 MVC 的一部分)。
  • @StephenMuecke 添加了DialogFormLink 类。
  • 不清楚你想在这里做什么。 get 方法不应将您的模型作为参数。将模型发送到誓言然后将其全部原封不动地发送回去有什么意义。您应该只是发送一个id 属性并根据id 再次获取模型。
  • 如果你确实想这样做,那么它的new { Model }(不是new { photo = @Model },但它不仅会生成一个丑陋的查询字符串,如果模型包含任何复杂对象的属性或集合,您可能会超出查询字符串限制并引发异常。
  • @StephenMuecke 我只是不想向服务器发出获取对象照片的新请求,因为我在主视图中有这个对象。是否可以避免此操作?单击“更新”后,我可以更改模型(它调用 ajax 对话框表单)。

标签: c# ajax asp.net-mvc-5 http-post http-get


【解决方案1】:

为了将模型传递回 GET 方法,您的代码需要是

@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", Model), "Update Photo", ....)

但是,通常您不应该这样做,原因如下

  1. 它创建了一个丑陋的查询字符串
  2. 它生成的查询字符串可能超过查询字符串 限制、抛出和异常
  3. 如果您的模型包含任何复杂对象的属性或 集合,模型绑定将失败,这些属性将 空

相反,您应该将模型的 ID 传递给 GET 方法,并从您的存储库(数据库、会话等)中获取模型,例如

@Html.DialogFormLink("Update", Url.Action("UpdatePhoto", new { id = Model.ID }), "Update Photo", ....)

在控制器中

public ActionResult UpdatePhoto(int ID)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 2015-08-24
    • 2014-05-02
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多