2016-08-14 3 views
2

Пожалуйста, помогите решить мою проблему. Я хочу получить сообщение, если текстовое поле TagsSites пуст.Как проверить внешний ключ IList? Entity Framework

Мои модели:

Сайт:

 public int Id { get; set; } 
     [Required] 
     public string UserId { get; set; } 
     [Required] 
     public string Name { get; set; } 
     [Required] 
     public string Description { get; set; } 
     [Required] 
     public string TypeMenuId { get; set; } 

     public virtual IList<Page> Pages { get; set; } 
     [Required] 
     public virtual IList<TagSite> TagsSites { get; set; }  
     public virtual TypeMenu TypeMenu { get; set; } 
     public virtual ApplicationUser User { get; set; } 

Tag:

 public int Id { get; set; } 
     public string Name { get; set; } 

     public virtual IList<TagSite> TagsSites { get; set; } 

TagSite:

 public int Id { get; set; } 
     public int SiteId { get; set; } 
     public int TagId { get; set; } 

     public virtual Site Site { get; set; } 
     public virtual Tag Tag { get; set; } 

Теперь я получаю это сообщение для всех пустых входов.

enter image description here

Как получить сообщение "Требуется поле TagsSites." ?

Спасибо.

+0

Что должно вводить пользователь в поле ввода тегов? Имена тегов, разделенные запятой? – Shyju

+0

Да. Я использую теги загрузки bootstrap – noobprogrammer

+0

Если это строка, почему бы не добавить свойство строки в вашу модель представления для значения строки и пометить ее атрибутом '[Обязательный]? – Shyju

ответ

1

Вы должны создать модель представления для вашего зрения со свойством для разделенных запятыми имена тегов и пометить его с атрибутом Required.

public class CreateSiteVm 
{ 
    [Required] 
    public string Name { set;get;} 
    [Required] 
    public string Description { set;get;} 
    [Required] 
    public string Tags { set;get;} 
    [Required] 
    public int TypeMenuId { set;get;} 
    public List<SelectListItem> TypeMenus { set;get;} 
} 

и прибудут действия

public ActionResult Create() 
{ 
    var vm = new CreateSiteVm(); 
    vm.TypeMenus = dbContext.TypeMenus.Select(x=> new SelectListItem { 
                  Value=x.Id.ToString(), 
                  Text=x.Name}).ToList(); 
    return View(vm); 
} 

и в вашей точке зрения,

@model CreateSiteVm 
@using(Html.BeginForm()) 
{ 
    <p>@Html.ValidationSummary(false)</p> 
    <label>Name</label> 
    @Html.TextBoxFor(f=>f.Name) 

    <label>Descsription</label> 
    @Html.TextBoxFor(f=>f.Descsription) 

    <label>Tags</label> 
    @Html.TextBoxFor(f=>f.Tags) 

    <input type="submit" /> 
} 

и в вашем HttpPost метода действия, создать объект вашей организации и установите значения с точкой зрения объект модели, который является вашим параметром метода. Вы можете использовать метод Split для разделения строки, разделенной запятыми.

[HttpPost] 
public ActionResult Create(CreateSiteVm model) 
{ 
    if(ModelState.IsValid) 
    { 
    var e=new Site { Name = model.Name, Description = model.Description}; 
    e.TypeMenuId = model.TypeMenuId; 

    var arr = model.Tags.Split(','); 
    foreach (var s in arr) 
    { 
     e.Tags.Add(new Tag { Name = s});  
    } 
    dbContext.Sites.Add(e); 
    dbContext.SaveChanges(); 
    return RedirectToAction("Index"); 
    } 
    //to do : Load the dropdown again same as GET 
    return View(model); 
} 
2

Здесь вы можете найти MinLengthAttribute. Реализация выглядит примерно так.

[Required] 
[MinLength (1)] 
public virtual IList <TagSite> TagSites { get; set; }