Asp.net mvc BeginForm<;t控制器>;韩元';t柱模型第一轮

Asp.net mvc BeginForm<;t控制器>;韩元';t柱模型第一轮,asp.net-mvc,razor,html.beginform,Asp.net Mvc,Razor,Html.beginform,我在使用最新的mvc扩展时遇到了一个问题。我已经禁用了clientsidevalidation,因为我读到它可能仍然有一个bug。基本上,第一次发布模型时为空,第二次(以及之后的任何时间)将发布模型 如果我将其切换回@using(Html.BeginForm())或@using(Html.BeginForm)(“action”、“controller”等),它会起作用,但我更愿意使用强类型版本。以下是我的代码: 控制器 [HandleError] public class HomeControl

我在使用最新的mvc扩展时遇到了一个问题。我已经禁用了clientsidevalidation,因为我读到它可能仍然有一个bug。基本上,第一次发布模型时为空,第二次(以及之后的任何时间)将发布模型

如果我将其切换回@using(Html.BeginForm())或@using(Html.BeginForm)(“action”、“controller”等),它会起作用,但我更愿意使用强类型版本。以下是我的代码:

控制器

[HandleError]
public class HomeController : BaseServiceController<IUserService>
{
    public HomeController(IUserService service, IMapper mapper, ICustomPrincipal user)
    : base(service, mapper, user)
    {}

    [AllowAnonymous]
    [HttpGet]
    public ActionResult Logon(string ReturnUrl)
    {
        LogonModel model = new LogonModel() { ReturnUrl = ReturnUrl };
        return View(model);
    }

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Logon(LogonModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        SfUser sfUser = service.Logon(model.UserName, model.Password);
        if (sfUser == null)
        {
            ModelState.AddModelError("General", "Username or Password incorrect");
            return View(model);
        }

        Response.Cookies.Add(TicketMaster.setAuthCookie(new CustomPrincipalSerializeModel(sfUser)));
        return Redirect(model.ReturnUrl);
    }
[HandleError]
公共类HomeController:BaseServiceController
{
公共家庭控制器(IUserService服务、IMapper映射器、ICustomPrincipal用户)
:base(服务、映射器、用户)
{}
[异名]
[HttpGet]
公共操作结果登录(字符串返回URL)
{
LogonModel model=new LogonModel(){ReturnUrl=ReturnUrl};
返回视图(模型);
}
[异名]
[HttpPost]
公共操作结果登录(LogonModel模型)
{
如果(!ModelState.IsValid)
{
返回视图(模型);
}
SfUser SfUser=service.Logon(model.UserName、model.Password);
if(sfUser==null)
{
AddModelError(“常规”、“用户名或密码不正确”);
返回视图(模型);
}
Add(TicketMaster.setAuthCookie(新的CustomPrincipalSerializeModel(sfUser));
返回重定向(model.ReturnUrl);
}
看法

@model LogonModel
@{
ViewBag.Title=“登录”;
}
//@使用(Html.BeginForm())//Works
@使用(Html.BeginForm(c=>c.Logon(Model)))
{
@HiddenFor(m=>m.ReturnUrl)
@LabelFor(m=>m.UserName)
@Html.TextBoxFor(m=>m.UserName)
@Html.ValidationMessageFor(m=>m.UserName)
@LabelFor(m=>m.Password)
@Html.PasswordFor(m=>m.Password)
@Html.ValidationMessageFor(m=>m.Password)


@Html.ValidationSummary(true)

}

如果它总是发布一个空模型,但只有在第一次发布时才发布,我可以理解这个问题。这让我很恼火。

我知道这很旧,可能已经以某种方式解决了,但是你应该将
null
而不是
model
传递给表达式。这样,模型将使用表单值构建

我花了几个小时。转到
强类型Html
部分。这是关键点:

您希望在窗体的范围内传递值,而不是 beginfound方法本身

对你来说,只要换衣服就行了

@using(Html.BeginForm<HomeController>(c => c.Logon(Model)))
@使用(Html.BeginForm(c=>c.Logon(Model)))

@使用(Html.BeginForm(c=>c.Logon(null)))
@using(Html.BeginForm<HomeController>(c => c.Logon(Model)))
@using(Html.BeginForm<HomeController>(c => c.Logon(null)))