你好,在ASP.net MVC网站上工作时,我遇到了一个奇怪的问题。 在重定向到Controller中的另一个Action时,我想添加一个get值,我喜欢这个
//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
//await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
return RedirectToAction("ConfirmEmailAwait", "Account", new { userId = user.Id }); //<-----[LOOK HERE]
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
//
// GET: /Account/ConfirmEmailAwait?userId=d178b665-b616-4303-ae7d-00a663014109
[AllowAnonymous]
public async Task<ActionResult> ConfirmEmailAwait(string userId)
{
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
string code = await UserManager.GenerateEmailConfirmationTokenAsync(userId);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userId, code = code }, protocol: Request.Url.Scheme);
string emailHeader = "Confirm your account";
string emailBody = "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>";
await UserManager.SendEmailAsync(userId, emailHeader, emailBody);
return View(userId);
}
据我所知,这段代码完成了它应该做的事情,它会将用户发送到正确的URL,因此它应该正常工作。但是如果你在这里看一下这个图像:
构建的网址:http://localhost:55767/Account/ConfirmEmailAwait?userId=d178b665-b616-4303-ae7d-00a663014109
错误讯息:未找到视图'd178b665-b616-4303-ae7d-00a663014109'或其主人或视图引擎没有支持搜索到的位置
你会看到它正在搜索的视图是我给它的获取值我觉得很奇怪。
有谁知道发生了什么事?我只是犯了一个愚蠢的错误而没有看到它?请帮帮我,并提前感谢你。
答案 0 :(得分:1)
您传递string
作为return View()
的第一个参数,该参数使用this overload,其中参数是视图的名称。您需要使用this overload将其作为object
传递,其中参数是您的模型。
return View((object)userId);
答案 1 :(得分:1)
当您需要View(String viewName)
。
View(Object model)
重载
要将String
值用作ViewModel
,您需要首先转换为Object
...:
return this.View( (Object)userId );
...或使用参数标签:
return this.View( model: userId );
使用参数标签是我的首选方法,因为转换为Object的原因可能不会立即显现给未来的代码读者,但您可能也想添加注释,以便用户知道为什么参数被明确命名以及为什么它不应被删除,例如:
return this.View( model: userId ); // Be careful not to call the `View(String viewName)` overload!
答案 2 :(得分:0)
// GET: /Account/ConfirmEmail
[AllowAnonymous]
public async Task<ActionResult> ConfirmEmailAwait(string userId)
{
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
string code = await UserManager.GenerateEmailConfirmationTokenAsync(userId);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userId, code = code }, protocol: Request.Url.Scheme);
string emailHeader = "Confirm your account";
string emailBody = "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>";
await UserManager.SendEmailAsync(userId, emailHeader, emailBody);
return View(userId);
}
在上面的代码中,请注意&#34;返回View(userId);&#34;
&#34;用户id&#34;是一个字符串 - 当返回View(字符串)时,Action认为你的userId实际上是View的路径(.cshtml文件)。
这就是为什么代码会出现异常,说它无法找到与提供的路径匹配的视图。
我希望这是有道理的: - )