Asp.net mvc 基于ViewModel的控制器动作重用

Asp.net mvc 基于ViewModel的控制器动作重用,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我将在我的网站上有一份登记表,首先显示董事会规则/法律。一旦接受,它将显示主登记表。使用ViewModel,如下所示: public class MyViewModel { public int Readrules { get; set; } public int Coppa { get; set; } } public ActionResult Register(MyViewModel model) { ... at this stage model.Readrule

我将在我的网站上有一份登记表,首先显示董事会规则/法律。一旦接受,它将显示主登记表。使用ViewModel,如下所示:

public class MyViewModel
{
    public int Readrules { get; set; }
    public int Coppa { get; set; }
}

public ActionResult Register(MyViewModel model)
{
    ... at this stage model.Readrules and model.Coppa will contain the values passed
        as query string parameters tat you could use here
}
如果我转到
/register
它将显示规则,然后
/register?readrules=1
它将显示注册表。这是如何在PHP中完成的,但现在我正在迁移到ASP.NET

这样做的最佳方式是什么?我是否可以重定向到同一个操作并只解析model.ReadRules的值,还是必须使用多个操作?我更愿意将其保存在一个操作中,只需检查
model.ReadRules==1
,然后显示boardrules或注册表

感谢您不要重复使用注册操作,您可以使用不同的控制器操作来显示规则、注册和处理注册,如下所示:

控制器操作:

public ActionResult BoardRules() 
{
    return View();
}

public ActionResult Register(MyViewModel model)
{
    if (model.ReadRules != 1)
        return RedirectToAction("BoardRules");

    return View();
}

public ActionResult Registration(MyViewModel model)
{
    if (model.ReadRules != 1)
        return RedirectToAction("BoardRules");

    //Process the registration

    return View();
} 
视图:

public ActionResult BoardRules() 
{
    return View();
}

public ActionResult Register(MyViewModel model)
{
    if (model.ReadRules != 1)
        return RedirectToAction("BoardRules");

    return View();
}

public ActionResult Registration(MyViewModel model)
{
    if (model.ReadRules != 1)
        return RedirectToAction("BoardRules");

    //Process the registration

    return View();
} 
BoardRules.cshtml:

@*HTML显示规则*@
Register.cshtml:

@使用(Html.BeginForm(“注册”,“控制器名称]”,新的{ReadRules=1}))
{
@*表单字段*@
} 
Registration.cshtml

恭喜注册!

当用户接受boardrules时,我如何才能返回到同一操作并提供注册视图?我更新了以前的回答,更彻底地回答了如何处理控制器不同操作之间的操作导航,而不是试图重新确定单个操作的用途。我更喜欢这个回答。如果我不想从
/register
转到
/registation
我想让它转到
/register/form
我该怎么做?我的答案是基于从单个控制器执行操作。因此,
注册
注册
董事会规则
都是该控制器的操作。你所问的将打破传统,需要路由规则。我建议重新评估对“表单”的需求。好的,我希望这至少有助于概述操作导航和重定向。当他们提交注册时,我还需要其他操作吗?我在寻找一个封装在一个视图中的东西,用于显示注册和boardrules视图之间的切换,另一个用于处理结果(如果可能),您需要一个方法类型。如果您的表单是POST,请在操作上添加[HttpPost]。您可以有两个操作使用与我提供的示例中相同的视图。为什么不在/register中显示规则并在/register/form中处理注册?那就简单多了。查询字符串背后的原因是什么?查询字符串来自我正在迁移的PHP代码,如果我有一个查询字符串,ViewModel元素会自动填充,我想我可以对注册和表单重复使用相同的操作方法,然后使用一个单独的方法来处理。本主题的主要目的是了解ASP.NET MVC中的最佳实践,因为在PHP中,很多数据都在URL中传递
@using (Html.BeginForm("Registration", "[Controller Name]", new { ReadRules = 1 }))
{
    @* Form Fields *@
    <input type="submit" value="Process Registration" />
} 
<h2>Congratz on Registering!</h2>
public ActionResult Register()
{
    return View("boardrules");       //Default
}

public ActionResult Register(MyViewModel model)
{
    if (model.ReadRules == 1)
    {
        model.ReadRules++;            //Next time it won't be 1 but step 2
        return View("registration",model);
    }
    else
    {
      //Do IF or Case for other step
    }
    return View("boardrules");       //Default
}