2017-02-24 26 views
1

我: GuestResponseRepository,IRepository - >接口,HomeController的 - > Controlle,谢谢 - >查看库布尔的观点

的GuestReresponseRepository有它的响应列表。当我通过表单添加回复时,回复将添加到列表中。当您尝试使用相同的值第二次添加响应时,AddReponse方法返回false。我想在我的视图中使用bool来显示不同的文本。我怎样才能做到这一点?下面我的代码

GuestResponseRepository

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using PartyInvites.Abstract; 

namespace PartyInvites.Models 
{ 
public class GuestResponseRepository : IRepository 

{ 
    private static List<GuestResponse> responses = new List<GuestResponse>(); 

    IEnumerable<GuestResponse> IRepository.GetAllResponses() 
    { 
     return responses; 
    } 

    bool IRepository.AddResponse(GuestResponse response) 
    { 
     if (responses.Any(x => x.Email == response.Email)) //here 
     { 
      if (responses.Any(x => x.WillAttend == response.WillAttend)) //here 
      { 
       return false; 
      } 

      var attend = responses.First(x => x.Email == response.Email && x.WillAttend != response.WillAttend); 
      attend.WillAttend = response.WillAttend; 
      return true; 
     } 

     responses.Add(response); 
     return true; 
    } 
} 
} 

IRepository

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using PartyInvites.Models; 

namespace PartyInvites.Abstract 
    { 
    public interface IRepository 
    { 
     IEnumerable<GuestResponse> GetAllResponses(); 
     bool AddResponse(GuestResponse response); 
    } 
} 

控制器

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using PartyInvites.Models; 
using PartyInvites.Abstract; 


namespace PartyInvites.Controllers { 
public class HomeController : Controller { 
    private IRepository repository; 

    public HomeController(IRepository iRepository) 
    { 
     this.repository = iRepository; 
    } 

    public ViewResult Index() { 

     return View(repository.GetAllResponses()); 
    } 


    public ViewResult PartyPeople() 
    { 
     return View(repository.GetAllResponses()); 
    } 

    [HttpGet] 
    public ViewResult RsvpForm() { 
     return View(); 
    } 

    [HttpPost] 
    public ViewResult RsvpForm(GuestResponse guestResponse) { 
     if (ModelState.IsValid) { 

      repository.AddResponse(guestResponse);     
      return View("Thanks", guestResponse); 
     } 
     else 
     { 
      // there is a validation error 
      return View(); 
     } 
    } 
} 
} 

视图

@model PartyInvites.Models.GuestResponse 

@{ 
ViewBag.Title = "Thanks"; 
} 

<div class="text-center"> 
    <h1>Thank you, @Model.Name!</h1> 
    <div class="lead"> 
     @if (Model.WillAttend == true) { 
      @:It's great that you're coming. The drinks are already in the fridge! 
     } else { 
      @:Sorry to hear that you can't make it, but thanks for letting us know. 
     } 

     @if (bool from Addresponse is false) { 
      @:<p>You already submitted this response. Are you sure this is right?</p> 
     } 

    </div> 
    <a href="/Home/PartyPeople">Link naar pp</a> 
</div> 
+0

我会建议不要将模型用作视图模型。您的控制器操作(或者更好的是某种服务)应该基于模型和存储库的返回来构建视图模型。这样可以避免使用ViewBag。 –

+0

可能重复的[MVC - 通过ViewData作为布尔](http://stackoverflow.com/questions/4321694/mvc-pass-viewdata-as-boolean) –

+0

我同意你。如果我知道如何,我会精确地按照你的方式去做。但这是他们教我做atm的。所以如果你有一些例子不要犹豫分享:) – valheru

回答

2

捕获来自AddResponses在布尔变量回归,并在ViewBag object

bool result = repository.AddResponse(guestResponse);     
ViewBag.Response = result; 
return View("Thanks", guestResponse); 

设置的自定义属性现在,在Thanks视图中,可以使用这个属性来决定写这文字

@model PartyInvites.Models.GuestResponse 
@{ 
    ViewBag.Title = "Thanks"; 
    bool response = (ViewBag.Response != null ? Convert.ToBoolean(ViewBag.Response) : false); 
} 

..... 

@if (!response) { 
    @:<p>You already submitted this response. Are you sure this is right?</p> 
} 
+0

非常感谢你,这个作品很棒:) – valheru