Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 远程验证可用于创建或编辑,但不能同时用于创建和编辑_C#_Jquery_Asp.net Mvc_Validation - Fatal编程技术网

C# 远程验证可用于创建或编辑,但不能同时用于创建和编辑

C# 远程验证可用于创建或编辑,但不能同时用于创建和编辑,c#,jquery,asp.net-mvc,validation,C#,Jquery,Asp.net Mvc,Validation,我想使用远程验证来检查用户名是否存在。我正在使用Viewmodel创建用户。虽然我可以这样做以获得创建或编辑目的的验证,但它不能同时用于创建和编辑。这是我的模型: [Required] [Display(Name = "Homeowner Username")] [Remote("doesUserNameExist", "Homeowners", HttpMethod = "POST", ErrorMessage = "User name already exists.

我想使用远程验证来检查用户名是否存在。我正在使用Viewmodel创建用户。虽然我可以这样做以获得创建或编辑目的的验证,但它不能同时用于创建和编辑。这是我的模型:

    [Required]
    [Display(Name = "Homeowner Username")]
    [Remote("doesUserNameExist", "Homeowners", HttpMethod = "POST", ErrorMessage = "User name already exists. Please enter a different user name.", AdditionalFields = "InitialUsername")]
这是我的编辑视图:

    @Html.Hidden("Homeowner.InitialUsername", Model.Username)


    <div class="form-group">
        @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
        </div>
    </div>
这是我的控制器,用于编辑但不创建(创建时,两个参数均为null):

我尝试过很多不同的方法,但都没能成功

我在这里看过:

在这里:

在这里:

但我似乎错过了什么。有没有一种方法可以让我在编辑和注册时都能做到这一点?我对这方面还很陌生,如果有任何想法,我将不胜感激

编辑:

也许这是一个糟糕的设计选择(第一次使用视图模型,只编码了几个月),但我试图创建一个新的屋主和地址,就像我创建一个新的应用程序用户一样。以下是我正在使用的viewmodel:

public class RegisterHomeownerViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
    public int roles { get; set; }
    public virtual Address Address { get; set; }
    public virtual Homeowner Homeowner { get; set; }
}
以下是我在帐户控制器中的方法:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> RegisterHomeowner(RegisterHomeownerViewModel model, Address address, Homeowner homeowner)
    {
        ApplicationDbContext db = new ApplicationDbContext();

        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {

                var role = db.Roles.Find("0");
                UserManager.AddToRole(user.Id, role.Name);
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                db.Addresses.Add(address);
                homeowner.UserId = user.Id;
                homeowner.AddressID = address.ID;
                db.Homeowners.Add(homeowner);
                db.SaveChanges();


                return RedirectToAction("Index", "Homeowners");

            }
            AddErrors(result);
        }

        return View(model);
    }
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务注册器Homeowner(注册器HomeOwnerServiceWModel模型、地址、房屋所有者房屋所有者)
{
ApplicationDbContext db=新的ApplicationDbContext();
if(ModelState.IsValid)
{
var user=newapplicationuser{UserName=model.Email,Email=model.Email};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
var role=db.Roles.Find(“0”);
UserManager.AddToRole(user.Id,role.Name);
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
db.address.Add(地址);
homeowner.UserId=user.Id;
homeowner.AddressID=address.ID;
db.屋主。添加(屋主);
db.SaveChanges();
返回操作(“索引”、“房主”);
}
加法器(结果);
}
返回视图(模型);
}
以下是我用来创建这些实体的视图:

<div class="form-horizontal">
    <h4>RegisterViewModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.Homeowner.Username, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Homeowner.Username, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Homeowner.Username, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
        </div>
    </div>

RegisterViewModel

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @LabelFor(model=>model.Homeowner.Username,htmlAttributes:new{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Homeowner.Username,new{htmlAttributes=new{@class=“form control”}) @Html.ValidationMessageFor(model=>model.Homeowner.Username,“,new{@class=“text danger”}) @LabelFor(model=>model.Email,htmlAttributes:new{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Email,new{htmlAttributes=new{@class=“form control”}) @Html.ValidationMessageFor(model=>model.Email,“,new{@class=“text danger”})

就我所知,除了对用户名进行远程验证之外,其他一切都正常工作。我可以让它在上面的account方法中创建时给我一个错误,或者我可以通过删除前缀在编辑时得到一个错误(这使得我的用户名无法识别。显然我做错了什么。

我明白了。我读了几次Stephen的帖子,读了几篇关于虚拟财产的文章。我上床睡觉,起床,通过删除所有数据模型修改了我的viewmodel。然后,为了在创建时进行验证,我将输入与验证pr进行了比较我的视图模型中的属性,而不是实际模型中的属性。这可用于创建。然后,当我编辑时,我将我的输入与实际模型中的验证属性进行比较。当我了解到可以对视图模型进行与模型中不同的验证时,这是有意义的。此线程也有帮助:。非常感谢!我从是!

显示创建方法的视图。如果您使用的是视图模型,那么您为什么要使用
houseowner.InitialUsername
而不是简单的
InitialUsername
。并且使用
绑定(Include=“…”
没有意义(您没有发布模型)。创建时怎么会有
InitialUsername
?我编辑了我的帖子,并提供了一些详细信息。我可以按照您的建议更改InitalUsername,但在尝试编辑时仍然无法同时获取用户名和InitalUsername。感谢上面帖子中的提示。在我无法获取Init之前ialUsername.A不应包含数据模型,当然也不应包含虚拟属性。但您试图如何处理
远程
属性(您迄今为止显示的内容毫无意义)。在任何情况下,您都需要两个单独的模型来创建和编辑)谢谢你的建议。我真的很感激。明白了。非常感谢斯蒂芬!你直截了当的指导真的帮了大忙。
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> RegisterHomeowner(RegisterHomeownerViewModel model, Address address, Homeowner homeowner)
    {
        ApplicationDbContext db = new ApplicationDbContext();

        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {

                var role = db.Roles.Find("0");
                UserManager.AddToRole(user.Id, role.Name);
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                db.Addresses.Add(address);
                homeowner.UserId = user.Id;
                homeowner.AddressID = address.ID;
                db.Homeowners.Add(homeowner);
                db.SaveChanges();


                return RedirectToAction("Index", "Homeowners");

            }
            AddErrors(result);
        }

        return View(model);
    }
<div class="form-horizontal">
    <h4>RegisterViewModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.Homeowner.Username, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Homeowner.Username, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Homeowner.Username, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
        </div>
    </div>