【问题标题】:How to properly use multiple partial views with different models ASP CORE如何正确使用不同模型的多个局部视图 ASP CORE
【发布时间】:2017-10-17 20:17:27
【问题描述】:

我的cshtml文件中有这个

<div class="login">
    @await Html.PartialAsync("_Login")
</div>
<div class="register">
    @await Html.PartialAsync("_Register")
</div>

我的部分看起来像这样

_登录:

@using Microsoft.AspNetCore.Identity
@using project.Models

@model LoginViewModel
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager


<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">

    ...

    <button id="loginBtn" type="submit" class="btn btn-default">Log in</button>   
</form>

_注册:

@using Microsoft.AspNetCore.Identity
@using project.Models

@model RegisterViewModel
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager


<form asp-controller="Account" asp-action="Register" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">

    ...

    <button id="registerBtn" type="submit" class="btn btn-default">Register</button>   
</form>

我的想法是让两个 div 之一始终具有 display:none (最初它是第二个具有此属性的),因此用户一次只能与一个表单交互。但是,当我单击 [登录] 按钮时,我收到此错误:

InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“cartoondrawme.Models.AccountViewModels.LoginViewModel”,但此 ViewDataDictionary 实例需要“cartoondrawme.Models.AccountViewModels.RegisterViewModel”类型的模型项。

我的问题是,我是否有缺陷,它是什么,或者这种方法完全错误,在这种情况下 - 什么是正确的方法?

我不明白一个表单的提交按钮如何触发另一个表单。如果我删除第二个 div,它可以正常工作。

谢谢。

【问题讨论】:

  • 我遇到了同样的问题。似乎是一个aspnet mvc核心的东西。曾经与 as.net mvc 一起正常工作。如果我想出一个解决方案,我会告诉你

标签: asp.net viewmodel partial-views asp.net-mvc-partialview


【解决方案1】:

我希望它不会太晚..我用这个method 来解决这个问题。 1) 创建一个类

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
    public string Name { get; set; }
    public string Argument { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
        controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
        isValidName = true;
        }

    return isValidName;
    }
}
  1. 编辑你的观点

    <form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">
    
        ...
    
        <button id="loginBtn" type="submit" class="btn btn-default" name="action:Login">Log in</button>   
    </form>
    
    <form asp-controller="Account" asp-action="Register" method="post" class="form-horizontal">
    
        ...
    
        <button id="registerBtn" type="submit" class="btn btn-default" name="action:Register">Log in</button>   
    </form>
    
  2. 将这些添加到控制器

    [HttpPost]
    [MultipleButton(Name = "action", Argument = "Login")]
    public IActionResult Login(LoginViewModel model) { ... }
    
    [HttpPost]
    [MultipleButton(Name = "action", Argument = "Register")]
    public IActionResult Register(RegisterViewModel model) { ... }
    

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2019-12-05
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多