根据参数显示部分视图

时间:2011-08-11 17:59:45

标签: asp.net-mvc

在更新C#MVC 2.0应用程序的过程中!

我有一个“注册”视图和另一个视图“ForgotPassword”。

每个视图都有一个提交按钮。

每个表单都提交给 相同的 控制器,但提交给两个不同的ActionResult:

[HttpPost]
public ActionResult Signup(SignupModel signupModel)
{…}

[HttpPost]
public ActionResult ForgotPwd(ForgotPasswordModel forgotPasswordModel)
{…}

完成后我的目标是将用户重定向到“thankyou”页面,但根据用户来自哪里(Signup或ForgotPassword)我希望显示特定消息(或不同的UI)。

在同一个Controller中,我创建了一个“Thankyou”ActionResult:

public ViewResult Thankyou() 
{
    return View(); 
}

我正在考虑在我的Thankyou()方法中添加参数,这样我就可以知道用户来自哪里(Signup或ForgotPwd)。从那里,让“thankyou”页面显示相应的UI /消息。

我正在寻找一个干净简单的解决方案。

我应该创建两个View User Controls并根据传递的参数显示适当的一个吗?

另外,我的Thankyou()方法没有使用“ActionResult”而不能使用“PartialViewResult”?


编辑: 我实际上正在考虑这些方面的事情......

其中ThankyouType是枚举。

[HttpPost]
public ActionResult Signup(SignupModel signupModel)
{
    //Validation code...
    return View("Thankyou", ThankyouType.SignupDone);
}

[HttpPost]
public ActionResult ForgotPassword(ForgotPasswordModel forgotPasswordModel)
{
    //Validation code...
    return View("Thankyou", ThankyouType.ForgotPasswordDone);
}

然后让我的“Thankyou”ViewResult像这样:

public ViewResult Thankyou(ThankyouType type) 
{ 
    return View(type); 
}

似乎我不能创建基于Enum的强类型视图(除非我错了)。

也许我会在PartialViewResults上阅读更多内容和/或找到示例......但话又说回来,我可能完全错了。

1 个答案:

答案 0 :(得分:1)

我个人会向ThankYou视图提供一个包含您要显示的消息的模型,并让您的两个控制器操作直接在成功时呈现ThankYou视图,而不是调用ThankYou操作。

但是,如果您确定要重定向,可以考虑使用TempData集合来存储消息或某种密钥。然后,ThankYou控制器可以检索此值并将其传递给View。这种情况是TempData的用途。

修改

没有理由你不能使用枚举值作为模型类型,但如果这给你带来麻烦,你至少应该能够创建一个具有枚举属性的模型类型。

作为重定向请求的一部分发送ThankYouType的策略可以正常工作,如果这是你喜欢的。唯一可能的缺点是它在URL中看起来像这样:

http://domain.com/controller/ThankYou?type=ForgotPasswordDone

我没有反对它的真实论据。有很多选择。使用最适合你的那个。