视图

时间:2016-02-10 18:41:08

标签: entity-framework asp.net-mvc-4 c#-4.0

在尝试所有解决方案后发布此问题时,这不是一个重复的问题。

我想在一个View上执行CRUD,所以我得到了这篇文章

CRUD using SIngle View

它工作正常,但是当我保持文本框为空时,Model为Valid返回false,这是正确的,在调试后显示Name字段是必需的,但是我无法在View上看到错误。

甚至@ Html.ValidationSummary(true)出现在Begin Form中 和@Html.ValidationMessageFor(model => model.Name)

因此,保持代码简短只使用了一个字段

模型

public partial class tblClient
{   
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
}

处理多个按钮的类

public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
}  

控制器

public class EmpController : Controller
{

    SampleEntities1 db = new SampleEntities1();  
    //
    // GET: /Emp/
    public ActionResult Index(int? id)  
    {  
        ViewBag.Operation = id;  
        ViewBag.Name = db.tblClients.ToList();  
        tblClient objEmp = db.tblClients.Find(id);  
        return View(objEmp);  
    }  

    [HttpPost]  
    [HttpParamAction]  
    [ValidateAntiForgeryToken]  
    public ActionResult Create(tblClient objEmp)   
    {  
        if (ModelState.IsValid)  
        {  
            db.tblClients.Add(objEmp);  
            db.SaveChanges();  
        }  
        return RedirectToAction("Index");  
    }  

    [HttpPost]  
    [HttpParamAction]  
    [ValidateAntiForgeryToken]  
    public ActionResult Update(tblClient objEmp)  
    {  
        if (ModelState.IsValid)  
        {  
            db.Entry(objEmp).State = EntityState.Modified;  
            db.SaveChanges();  
        }  
        return RedirectToAction("Index", new { id = 0 });  
    }  

    public ActionResult Delete(int id)  
    {  
        tblClient objEmp = db.tblClients.Find(id);  
        db.tblClients.Remove(objEmp);  
        db.SaveChanges();  
        return RedirectToAction("Index", new { id = 0 });  
    }  
}  

查看

@using (Html.BeginForm())
  {

<fieldset>
    <legend><b>Emp Details</b></legend>
    <table border="1" cellpadding="10">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>

            <th>
                Action
            </th>
        </tr>

        @foreach (var item in (IEnumerable<SingleVIewCrud.Models.tblClient>)ViewBag.Name)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.ActionLink("Edit", "Index", new { id = item.Id }) |
                    @Html.ActionLink("Delete", "Delete", new { id = item.Id })
                </td>
            </tr>
        }

    </table>
</fieldset>

        @Html.AntiForgeryToken()
        <div class="form-horizontal">
            @Html.ValidationSummary(true)

            <fieldset>
                <legend> <b>Entry Screen</b></legend>

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

                <div class="form-group">
                    <p>
                        <input type="submit" value="Create" name="Create"
                               style=@((ViewBag.Operation != null && Convert.ToInt32(ViewBag.Operation) > 0) ? "display:none" : "display:block") />
                        <input type="submit" value="Update" name="Update"
                               style=@((ViewBag.Operation != null && Convert.ToInt32(ViewBag.Operation) > 0) ? "display:block" : "display:none") />
                    </p>
                </div>
            </fieldset>
        </div>
}

未显示验证错误消息有什么问题。

1 个答案:

答案 0 :(得分:1)

在您的Create()Edit() POST方法中,如果ModelState无效,您只需重定向到Index()视图。您需要返回现有视图 -

if (!ModelState.IsValid()
{
    return View(objEmp);
}
// save and redirect
db.tblClients.Add(objEmp);  
db.SaveChanges();  
return RedirectToAction("Index");  

附注:如果您包含jquery.validate.jsjquery.validate.unobtrusive.js脚本,那么您还将获得客户端验证,甚至不会命中POST方法 - 将显示验证消息并提交将被取消