【问题标题】:Asp.Net MVC3 - Complex class not being passed as null on [HttpPost] methodAsp.Net MVC3 - 复杂类未在 [HttpPost] 方法上作为 null 传递
【发布时间】:2013-01-21 18:57:39
【问题描述】:

是我……又一次!

我已经上了这些课,

 public class PrankTargetArgumentViewModel
{
    public PrankTarget Target { get; set; }
    public PrankDefinition Prank { get; set; }
    public List<PrankArgument> Arguments { get; set; }
}

public class PrankArgument
{
    public string Name { get; set; }
    public string Value { get; set; }
}

而我正在做的是 - 如果当前的 ParkDefinition 需要参数,他们会在保存到另一个应该处理参数收集的 Action 时执行 ActionRedirect

我的Action结果是这样的..

    public ActionResult PrankArguments()
    {
        PrankInstance currentInstance = SessionContext.CurrentPrankInstance;

        if (currentInstance == null)
            throw new ArgumentNullException("currentInstance");

        PrankTargetArgumentViewModel model = new PrankTargetArgumentViewModel();
        model.Prank = currentInstance.Prank;
        model.Target = currentInstance.Target;

        string[] args = model.Prank.Arguments.Split('|');

        model.Arguments = new List<PrankArgument>();
        foreach (string s in args)
        {
            model.Arguments.Add(new PrankArgument { Name = s, Value = s });
        }

        return View(model);
    }

我的http post方法只是一个带有PrankTargetArgumentViewModel参数的空方法

    [HttpPost]
    public ActionResult PrankArguments(PrankTargetArgumentViewModel model)
    { 
        return View();
    }

我的 HTML 是这样的..

@using (Html.BeginForm())
{
@Html.EditorFor(x => Model)  

<p>
    <input type="submit" value="Create" />
</p>
}

所以我的问题是,在 PrankArguments(PrankTargetArgumentViewModel model) 回发操作中,模型参数始终为空。我已经用负载值填充了对象,所以我猜他们会在回帖中包含我添加的新论点。

所以流程是这样的。

制造恶作剧 如果恶作剧需要参数,则加载 ActionResult PrankArguments() 向已填充的对象添加额外的参数。 保存,调用 ActionResult PrankArguments(PrankTargetArgumentViewModel 模型) -- 这就是问题所在,模型参数传回为null。

我遇到过这个问题好几次了,总是放弃,但这次我不会让这种情况发生!

任何帮助都会很棒!干杯,Ste!

附言。如果您需要我的代码,请告诉我。

编辑 - 删除了视图包调试属性!

【问题讨论】:

  • 你的问题有点不清楚......你的意思是:“为什么 ViewBag.Model 在每个帖子上都为空?”
  • 另外,为什么要在 ViewBag 上设置属性?
  • 对不起,这纯粹是为了调试,我忘了删除。希望问题更清楚。
  • 如果您调试您回发的操作,您的 Request.Form 对象包含什么?值是否已正确发布但未解析到模型中?
  • 我查看了 Request.Forms 内容及其回发的 Request.Form = {argument.Value=Address&argument.Value=UnMute} 这是我正在寻找的值 - 它并不理想,但我可以和他们一起工作!

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


【解决方案1】:

我想如果我正确理解了你的观点,如果你的视图被强输入到PrankTargetArgumentViewModel,那么你所要做的就是检索这些值:

[HttpPost]
public ActionResult PrankArguments()
{ 
    var pta = new PrankTargetArgumentViewModel();
    TryUpdateModel(pta);
}

【讨论】:

  • @stephen 是强类型为 PrankTargetArgumentViewModel 的视图吗?即在您的顶部视图中,您拥有:@Model PrankTargetArgumentViewModel,在您看来,您可以尝试 @Html.EditorForModel() 而不是 @Html.EditorFor(x =&gt;model)
【解决方案2】:

查看我自己的代码后,我注意到我不需要整个 PrankTargetArgumentViewModel,一个简单的参数列表就可以了。

我更改了我的 PrankArguments 视图以采用 IEnumerable 并已使用;

@using (Html.BeginForm())
{
@Html.EditorForModel()

<p>
    <input type="submit" value="Finish" />
</p>
}

然后有我这样的回发方法签名

 [HttpPost]
 public ActionResult PrankArguments(IEnumerable<PrankArgument> arguments)

这正是我想要的。

感谢大家的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2018-05-19
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多