Asp.net mvc 在呈现ActionLink时,如何模拟模型绑定行为?

Asp.net mvc 在呈现ActionLink时,如何模拟模型绑定行为?,asp.net-mvc,asp.net-mvc-3,model-binding,Asp.net Mvc,Asp.net Mvc 3,Model Binding,在下面的代码中,get操作返回给定比赛日期的投注卡,post I使用post操作将绑定模型的属性转换为get操作的路由值 详细信息视图的基本方面: @using (Html.BeginForm("Upload", "BettingCard", FormMethod.Post, new { id = "uploadForm", enctype = "multipart/form-data" })) { @Html.ValidationSu

在下面的代码中,get操作返回给定比赛日期的投注卡,post I使用post操作将绑定模型的属性转换为get操作的路由值

详细信息视图的基本方面:

@using (Html.BeginForm("Upload", "BettingCard",
                         FormMethod.Post, new { id = "uploadForm", enctype = "multipart/form-data" }))
{ 
    @Html.ValidationSummary(true, "The upload was unsuccessful.  The following error(s) occurred: ")
    <div id="date-selector">
        <div id="ymd">
            @Html.LabelFor(model => model.RaceDate)
            @Html.DropDownListFor(model => model.RaceDay, Model.YmdLists.Days)
            &nbsp; @Html.DropDownListFor(model => model.RaceMonth, Model.YmdLists.Months)
            &nbsp; @Html.DropDownListFor(model => model.RaceYear, Model.YmdLists.Years)
            &nbsp;&nbsp;<input type="submit" value="Upload for this date" />
        </div>
    </div>
    @Html.Telerik().Upload().Name("UploadedFiles")
}
[HttpGet]
public ActionResult Details(int year, int month, int day) {
    var model = new BettingCardModel
                    {
                        ResultMessage = "No betting card was located for the selected date."
                    };
    DateTime passedDate;
    if (!DateTimeHelper.TrySetDmy(year, month, day, out passedDate)) {         
        ModelState.AddModelError("", "One or more values do not represent a valid date.");
        return View(model);
    }
    model.RaceDate = passedDate;
    var bettingCard = _bettingCardService.GetByRaceDate(passedDate);
    model.MapFromEntity(bettingCard);
    return View(model);
}

[HttpPost]
public ActionResult Details(BettingCardModel model)
{
    return RedirectToAction("Details", new { year = model.RaceYear, month = model.RaceMonth, day = model.RaceDay });
}
上面的代码中有很多是实验性的和诊断性的,所以我不想对有效的代码进行审查,而是集中精力于我需要实现的目标。在
Details
视图中,我只需要一个“命令”,即“Display for Date”,因此我可以通过使用submit按钮轻松下车,而http post负责模型绑定。但是,在
Upload
视图中,我需要两个命令,即“显示日期”和“上传日期”,因此我想让“显示日期”严格使用get操作,并且只使用post操作提交上传的日期投注卡

我的问题是,当我使用“显示日期”命令时,使用ActionLink而不是submit,使用
model.RaceDay
等作为路由值,传递到
Details
的URL参数仍然包含其初始值,而不是用户在下拉列表中设置的值。似乎没有为操作链接调用模型绑定代码(不管是什么)。我能在这里做些什么来避免仅仅为了装订而需要一篇文章


我意识到这可能不是一个直接的模型绑定问题,但我不知道如何表达我的问题。当呈现“绑定”到模型属性的元素时,它们比简单的输入(比如)和一些基本样式有更多的优势,但是围绕该输入使用大量元数据“构建”了一些东西。我想在单击页面上的get链接时使用元数据映射到URL。

您遇到的问题是,所有模型数据和元数据都是在服务器上动态生成的,并作为静态内容提供给客户端。绑定仅在将模型提交到服务器后才知道模型的更改。所有这些模型元数据在客户端都是静态的,使用纯.NET,它无法知道用户何时更改下拉列表中的值以同时更改静态锚标记中的值,而静态锚标记正是ActionLink呈现的对象。答案是使用javascript。有很多方法可以通过javascript实现您的目标。您可以编写一个定制的HtmlHelper类来为您生成javascript。但是,如果您不想使用javascript,那么您必须通过post将用户选择的数据发送到服务器

如果您试图避免重新编写代码,那么可以为表单内容创建一个局部视图,并将其嵌入到两个单独的视图中。您可以尝试的另一件事是通过两个同名的提交按钮来检测按下了哪个按钮,如下所示:

    <input type="submit" name="command" value="Update" />
    <input type="submit" name="command" value="Display" />

希望这对您有所帮助。

您还可以拥有
公共操作结果详细信息(BettingCardModel,string命令)
然后像
if(command==“Display”)
一样进行测试。使控制器更易于测试。
[HttpPost]
public ActionResult Details(BettingCardModel model)
{
    if (Request.Forms["command"].Equals("Display"))
    {
        return RedirectToAction("Details", new { year = model.RaceYear, month = model.RaceMonth, day = model.RaceDay });
    }

    // Do your update code here...
    return // Whatever it is you return for update.
}