2017-02-24 24 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