为什么ASP.NET MVC使用View名称的GET操作参数值?

时间:2017-03-09 20:14:45

标签: c# asp.net asp.net-mvc get

你好,在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,因此它应该正常工作。但是如果你在这里看一下这个图像:

Error image

构建的网址:http://localhost:55767/Account/ConfirmEmailAwait?userId=d178b665-b616-4303-ae7d-00a663014109

错误讯息:未找到视图'd178b665-b616-4303-ae7d-00a663014109'或其主人或视图引擎没有支持搜索到的位置

你会看到它正在搜索的视图是我给它的获取值我觉得很奇怪。

有谁知道发生了什么事?我只是犯了一个愚蠢的错误而没有看到它?请帮帮我,并提前感谢你。

3 个答案:

答案 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文件)。

这就是为什么代码会出现异常,说它无法找到与提供的路径匹配的视图。

我希望这是有道理的: - )