簡體   English   中英

Model 在 POST 中未完全綁定

[英]Model not completely binding in POST

不明白我在這里監督什么......我有一個 Model 我在視圖中呈現。

這是訂閱視圖模型:

public Subscription Subscription { get; set; }

public DayOfWeek DayOfWeek { get; set; }

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

在視圖中,我使用來自 SubscriptionViewModel 的數據填充了一個表。 在每個表行中都有一個 If/else 語句,在每個部分中我放置了一個表單,以便可以將數據回發到 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,日期參數也有正確的值,唯一丟失的是來自我的SubscriptionViewModel的Subscription Entity的參數。 它們不是 NULL 但最初進入視圖時它們只是沒有初始值......

不知道我在監督什么,我嘗試在視圖中使用TempData.Keep() (我以前從來不需要這樣做),但這也不起作用。

歡迎任何建議! 謝謝!

此答案假定您不希望 Subscription 的值來自表單,而是在最初將值發送到聽起來像您所追求的視圖時保持原樣。

您需要使用隱藏字段在表單中包含訂閱值(參見示例 1)。 或者,您需要以與 get 方法相同的方式在您的 post 方法中填充訂閱(參見示例 2)。

這里有 2 個簡單的例子來說明我的意思

假設這是您的訂閱 class

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

示例 1

HiddenField 方式

controller

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

以 controller 方式返回

controller

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" />
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM