1

ASP.NET MVC(古いバージョン)アプリケーションで作業しており、日付とRoomIDの2つのパラメーターに基づいて予約を検索するためのフォームを作成する必要があります。データベースには、RoomidでリンクされたReservationRequestsとRoomsという基になるテーブルがあります。

私はこのクエリをリポジトリに書きました:

public IQueryable<ReservationRequest> FindReservationRequestInfo(DateTime date, int roomID)
    {
        return from requests in FindAllReservationRequests()
                where requests.Date == date

                    & requests.RoomID == roomID

                select requests;
    }

モデルは次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
namespace RoomReservations.Models
{
    public class FindReservationRequestInfo
{
    public IQueryable<string> ReservationRequestsInfo { get; set; }
    public DateTime Date { get; set; }

    public SelectList Rooms { get; set; }

    public FindReservationRequestInfo(IQueryable<string> reservationRequestsInfo, DateTime date, SelectList rooms)
    {
        ReservationRequestsInfo = reservationRequestsInfo;
        Date = date;
        Rooms = rooms;
    }
}

}

そして、コントローラーのコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using RoomReservations.Models;
using RoomReservations.Helpers;
using Telerik.Web.Mvc;


namespace RoomReservations.Controllers
{
    public class ReportsController : Controller
{
    IRepository Repository;

    public ReportsController()
        : this(new Repository())
    {
    }

    public ReportsController(IRepository repository)
    {
        Repository = repository;
    }


    //
    // GET: /Reports/FindReservationRequestInfo
    [Authorize(Roles = "Administrator")]
    public ActionResult FindReservationRequestInfo()
    {
        IEnumerable<Room> rooms = Repository.FindAllRooms();
        rooms = rooms.Concat(new List<Room>() { new Room() }.AsEnumerable()).OrderBy(o => o.ID);

        return View(new FindReservationRequestInfo(
            new List<string>().AsQueryable(), DateTime.Today,
            new SelectList(rooms, "ID", "Name")));
    }

    //
    // POST: /Reports/FindReservationRequestInfo
    [AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Administrator"), ValidateAntiForgeryToken]
    public ActionResult FindReservationRequestInfo(FormCollection collection)
    {
        IQueryable<string> reservationRequestsInfo;
        DateTime date = DateTime.Today;

        Room room = Repository.GetRoom(Convert.ToInt32(collection["ID"]));

        if (collection["Date.Date"] == String.Empty)
            ModelState.AddModelError("Date.Date", "Date is required");



        if (ModelState.Sum(s => s.Value.Errors.Count()) == 0)
        {
            date = DateTime.Parse(collection["Date.Date"]);

            if (room == null)
            {
                room = new Room();
                reservationRequestsInfo = Repository.FindReservationRequestInfo(date, room.ID);
            }

        }
        else
        {
            reservationRequestsInfo = new List<string>().AsQueryable();
        }

        IEnumerable<Room> rooms = Repository.FindAllRooms();
        rooms = rooms.Concat(new List<Room>() { new Room() }.AsEnumerable()).OrderBy(o => o.ID);

        return View(new FindReservationRequestInfo(
            reservationRequestsInfo, date,
            new SelectList(rooms, "ID", "Name", room.ID)));
    }
 }

} //

コントローラのコードの何が問題なのかわかりません。誰かが私が間違ったことを理解するのを手伝ってくれるなら、私はとても感謝しています。事前にどうもありがとうございました!

4

1 に答える 1

2

クエリが返されます

IQueryable<ReservationRequest>

しかし、コントローラーでは、宣言する変数と同じに設定しています

IQueryable<string>

だからこのビット

    [AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Administrator"), ValidateAntiForgeryToken]
    public ActionResult FindReservationRequestInfo(FormCollection collection)
    {
        IQueryable<string> reservationRequestsInfo;
        //...

する必要があります

    [AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Administrator"), ValidateAntiForgeryToken]
    public ActionResult FindReservationRequestInfo(FormCollection collection)
    {
        IQueryable<ReservationRequest> reservationRequestsInfo;
        //...

次に、変更のカスケード効果に合わせて適切にリファクタリングします。

于 2013-03-08T19:41:50.387 に答える