其他分享
首页 > 其他分享> > 有没有适当的方法来添加模型错误的IEnumerable模型字段以突出显示视图中的特定输入,但不是全部?

有没有适当的方法来添加模型错误的IEnumerable模型字段以突出显示视图中的特定输入,但不是全部?

作者:互联网

好吧,我有一些产品的视图模型:

public class ProductsAddModel 
{
    public IEnumerable<string> Names {get;set;}
}

我需要一次添加多个产品名称,但是如果已经存在带有输入名称之一的产品,我想为名称添加模型错误并在视图中突出显示正确的输入.它基本上看起来像:

[HttpPost]
public ActionResult(ProductsAddModel model)
{
    if(ModelState.IsValid)
    {
        var existedProducts = productRepository.AllProducts;
        if(model.Names.Any(n => existedProducts.Select(p => p.Name).Contains(n)))
        {
             ModelState.AddModelError("Names", "Error");
             return View(model);
        }
    }
}

但是在这种情况下,所有“名称”输入都会在视图中突出显示.如何突出显示特定名称输入-导致错误的输入.我有几种解决方案,例如过去的错误名称和视图数据,如果其值与错误名称匹配,则可以在文本输入中添加视图添加错误类.就像是:

var match = existedProducts.Select(p => p.Name).FirstOrDefault(n => model.Names.Contains(n));
if(match != null)
{
      ModelState.AddModelError("Names", "Error");
      ViewBag.ErrorName = match.Name;
      return View(model);
}

并且鉴于:

for (int i; i<Model.NumberOfInputs; i++)
{
    var value = Model.Names != null && Model.Names.Count() < index ? Model.Names.ToArray()[index] : string.Empty;
    var errorClass = value.Equals(ViewBag.ErrorName) ? "error" : string.Empty;
    <input type="text" name="Names" value="@value" class="@errorClass" />
}

…或为每个输入创建局部视图,使用唯一键将错误名称保存到临时数据(不查看数据以通过操作发送此值),为每个输入局部视图创建渲染操作,生成输入ID(或一些自定义数据属性)和temp数据错误键(使用相同的模式),检查temp数据中此输入是否存在错误,如果存在,请为“ Names”添加模型错误.如下所示:

var match = existedProducts.Select(p => p.Name).FirstOrDefault(n => model.Names.Contains(n));
if(match != null)
{
      ModelState.AddModelError("Names", "Error");
      var key = string.Format("Names-{0}", match.Name);
      TempData[key] = "Error"; // or just true
      return View(model);
}

视图:

for (int i; i<Model.NumberOfInputs; i++)
{
    var value = Model.Names != null && Model.Names.Count() < index ? Model.Names.ToArray()[index] : string.Empty;
    Html.RenderAction("RenderInputAction", new {name = value});
}

我正在谈论的其他动作:

public PartialViewResult RenderInputAction(string name)
{
     var key = string.Format("Names-{0}", name);
     if(TempData[key])
     {
          ModelState.AddModelError("Names", "Error");
     }
     return PartialView("NameInput", name);
}

部分视图本身:

<input type="text" name="Names" value="@Model" />

如您所见,这些是健壮且奇怪的方法.我只想知道MVC框架中是否存在一些适当且更简单的方法来处理此类复杂模型及其模型状态错误?也许是name属性的前缀来捕获特定的输入或类似的东西.我什至不知道要用谷歌找到答案.提前致谢.

解决方法:

好问题!我不确定..所以我尝试了.这是我发现的.

我的测试具有如下模型:

public class TestModel {
    public IList<string> Items { get; set; }

    public TestModel()
    {
        Items = new List<string>() { "Simon", "Whitehead" };
    }
}

..a这样的视图:

@model MvcApplication1.Models.TestModel

@using (Html.BeginForm())
{
    for (var i = 0; i < Model.Items.Count; i++)
    {
        <p>
            @Html.TextBoxFor(x => Model.Items[i])
        </p>
        <p>@Html.ValidationMessageFor(x => Model.Items[i])</p>
    }

    <input type="submit" />
}

这将显示名称Items [0]和Items [1].基本上,您添加具有相同名称的模型错误:

[HttpPost]
[ActionName("Index")]
public ActionResult Index_Post(TestModel model)
{
    for (int i = 0; i < model.Items.Count; i++)
    {
        if (string.IsNullOrEmpty(model.Items[i]))
        {
            // empty name is Items[i]
            ModelState.AddModelError(string.Format("Items[{0}]", i), "Required");
            return View(model);
        }
    }

    return null;
}

对我来说很好.空白时,需要使用单独的框.结果是:

标签:asp-net-mvc-4,c,asp-net-mvc,model
来源: https://codeday.me/bug/20191122/2058395.html