ASP.net核心 - 相同的动作,两个视图:一个参数为空,但另一个是好的

时间:2016-09-07 01:52:15

标签: .net asp.net-core asp.net-core-mvc

我有两个不同的视图和一个控制器。两者都有日期选择器组合框。它适用于一个视图但不适用于另一个视图。

模型#1:

public class TripDate
{
    public List<DateTime> listDates { get; set; }
    public DateTime? selectedDate { get; set; }
}

模型#2

public class AdminManageModel
{
    public TripDate date { get; set; }
    public string FormMessage { get; set; }
}

此代码在视图ChooseDate.cshtml

中正常工作
@model TripManagement.Models.TripDate    
<form asp-action="ChooseDate" method="post">
        <select asp-for="selectedDate">
            @if (Model.listDates.Count == 0)
            {
                <option>-</option>
            }
            else
            {
                foreach (var date in Model.listDates)
                {
                    <option>@date.ToString("d")</option>
                }
            }
        </select>
        <button type="submit">Submit</button>
</form>

以上称此操作为:

[HttpPost]
public IActionResult ChooseDate(string selectedDate)
{
    return RedirectToAction("TripManage", new { selectedDate = selectedDate });
}

字符串&#34; selectedDate&#34;有价值。我的问题是当我尝试使用另一个名为AdminManage.cshtml的视图调用此相同的操作时,字符串selectedDate为NULL。我在这个MVC业务上相当新,所以我想也许这与我不知道的某种幕后模型绑定有关。我尝试完全采取单独行动来做同样的事情:

AdminManage.cshtml

@model TripManagement.Models.AdminManageModel    
<form asp-action="AdminManage" method="post">
        <select asp-for="date.selectedDate">
            @if (Model.date.listDates.Count == 0)
            {
                <option>-</option>
            }
            else
            {
                foreach (var date in Model.date.listDates)
                {
                    <option>@date.ToString("d")</option>
                }
            }
        </select>
        <button type="submit">Submit</button>
</form>

调用以下操作(与上面的ChooseDate完全相同):

[HttpPost]
public IActionResult AdminManage(string selectedDate)
{
    return RedirectToAction("TripManage", new { selectedDate = selectedDate });
}

在此操作中,selectedDate始终为NULL。我无法弄清楚为什么会发生这种情况。某些地方无法正确映射,但由于这是我的第一个MVC项目,我不知道如何进一步解决这个问题。两个视图ChooseDate.cshtml和AdminManage.cshtml之间的区别在于它们使用不同的模型,但模型属性应该在这里工作,不是吗?

我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为问题在于你改变了#34; asp-for&#34;属性,无需调整服务器端方法。

你的第一个例子与你的第二个例子不同:

<select asp-for="selectedDate">
<select asp-for="date.selectedDate">

这意味着您的表单会发布&#34; date.selectedDate&#34;而不是&#34; selectedDate&#34;因此你的模型绑定失败的原因。

尝试修改您的&#34; AdminManage&#34;方法:

public IActionResult AdminManage([Bind(Prefix="date")]string selectedDate)