【问题标题】:Model not completely binding in POST模型在 POST 中没有完全绑定
【发布时间】:2020-03-06 11:32:52
【问题描述】:

不明白我在这里监督什么... 我有一个在视图中渲染的模型。

这是 SubscriptionViewModel:

public Subscription Subscription { get; set; }

public DayOfWeek DayOfWeek { get; set; }

public List<DateTime> SomeDates { get; set; }

在视图中,我使用来自 SubscriptionViewModel 的数据填充了一个表。 在每个表格行中都有一个 If/else 语句,在每个部分中我放置了一个 Form,以便可以将数据回传到 SubscriptionController,这是一个伪示例:

if (condition)
{
    using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
    {
        @Html.ActionLink("text", "Subscribe", new { @date = item }, new { @class = "btn btn-warning btn-radius" })
    }
}
else
{
    using (Html.BeginForm("UnSubscribe", "Subscription", FormMethod.Post))
    {                                                                   
        @Html.ActionLink("text", "UnSubscribe", new { @date = item }, new { @class = "btn btn-danger btn-radius" })
    }
}

这是被触发的 SubscriptionContoller 方法:

[AllowAnonymous]
public ActionResult Subscribe(SubscriptionViewModel model, string date)
{
    return View();
}

POST 被触发,我的 Model 不是 NULL,date 参数也有正确的值,唯一丢失的是来自 Subscription 实体的参数我的订阅视图模型。它们不是 NULL,但它们只是在最初进入 View 时没有它们的初始值......

不知道我在监督什么,我尝试在视图中使用TempData.Keep()(我以前从来不需要这样做),但这也不起作用。

欢迎提出任何建议! 谢谢!

【问题讨论】:

  • 您的数据检索是什么样的?
  • 表单中只有超链接时如何触发帖子?
  • @JasonRoner,你的意思是我在渲染模型之前如何填充它?
  • @DaveBarnett,@Html.ActionLink("text", "Unsubscribe", ...) 指向应该发布的 Action。我在网上的一个例子中看到了这一点。
  • 这将为您提供一个超链接,这意味着该表单将不会发布。您将通过 get 请求进入 subscribe 方法,该请求可以工作,但不是正确的方法。

标签: c# asp.net-mvc post model-view-controller model


【解决方案1】:

此答案假定您不希望订阅的值来自表单,而是保持原来将值发送到听起来像您所追求的视图时的原样。

您需要使用隐藏字段在表单中包含订阅的值(参见示例 1)。或者,您需要像在 get 方法中一样在您的 post 方法中填充订阅(参见示例 2)。

这里有两个简单的例子来说明我的意思

假设这是您的订阅课程

public class Subscription
{
    public int Id { get; set; }
    public string Name { get; set; }
}

示例 1

HiddenField 方式

控制器

public class SubscriptionController : Controller
{       
    [AllowAnonymous]
    public ActionResult Subscribe()
    {
        var viewModel = new SubscriptionViewModel
        {
            Subscription = GetSubscription()
        };

        return View(viewModel);
    }

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Subscribe(SubscriptionViewModel model, string date)
    {
        return View();
    }

    private Subscription GetSubscription()
    {
        return new Subscription
        {
            Id = 1,
            Name = "My Subscription"
        };
    }
}

景色

@model {The namespace}.SubscriptionViewModel

@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
    //Other fields 
    @Html.HiddenFor(x => x.Subscription.Id)
    @Html.HiddenFor(x => x.Subscription.Name)
    <input type="submit" value="submit" />
}

示例 2

以控制器方式返回

控制器

public class SubscriptionController : Controller
{
    [AllowAnonymous]
    public ActionResult Subscribe()
    {
        var viewModel = new SubscriptionViewModel
        {
            Subscription = GetSubscription()
        };

        return View(viewModel);
    }

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Subscribe(SubscriptionViewModel model, string date)
    {
        model.Subscription = GetSubscription();

        return View();
    }

    private Subscription GetSubscription()
    {
        return new Subscription
        {
            Id = 1,
            Name = "My Subscription"
        };
    }
}

景色

@model {The namespace}.SubscriptionViewModel

@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{     
    //Other fields 
    <input type="submit" value="submit" />
}

【讨论】:

  • 我想最初使用我填充的模型中的数据加载视图,视图的目的是让用户选择一个日期,该日期应该添加到模型中的初始数据中,所以我想我不应该使用 @Html.ActionLink(...) 而是使用输入字段?将尝试此并回帖,感谢您的建议和信息!
  • 是的,这是有道理的。将日期信息添加为隐藏字段。不客气!
  • 我这样做了,但我的控制器参数(模型)仍然有空值。我不明白模型本身不是 NULL,只是模型的属性未分配......它似乎失去了值,但仍然保持它的实例(不是 NULL)。有什么建议吗?
  • 好的,我把某些事情搞混了,需要重新考虑我所做的是否好。现在,当我加载并显示他的视图时,我的模型中有我需要的所有值,除了我希望用户选择的日期。所以我只有 1 个剃须刀助手 HiddenFor,它允许我检索所选日期(感谢@Dave Barnett),但我不明白为什么我的模型在到达控制器时没有它的值,是因为我需要在 Html.BeginForm(...) 范围内定义所有模型的属性?
  • 是的,它需要在每个 Html.BeginForm() 中都有它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多