Asp.Net MVC3 - 复杂类未在[HttpPost]方法上作为null传递

时间:2011-08-16 07:35:30

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

我的......再一次!

我得到了这些课程,

 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

我的行动结果是这样的..

    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模型)回发动作时,模型参数总是为空的。我已经用负载上的值填充了对象,所以我猜他们我会在帖子中找到我添加的新参数。

所以流程就是这样。

  

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

我已经有这个问题很多次了,而且总是放弃但是这次我不会让这种情况发生!

任何帮助都会很棒!欢呼,Ste!

聚苯乙烯。如果您需要我的代码,请告诉我。

编辑 - 删除了查看包调试属性!

2 个答案:

答案 0 :(得分:0)

我认为,如果您的观点被强烈输入PrankTargetArgumentViewModel,我理解正确,那么您需要做的就是检索值:

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

答案 1 :(得分:0)

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

我改变了我的PrankArguments视图以获取IEnumerable并使用;

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

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

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

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

完全符合我的要求。

感谢所有建议人员。