我怎样才能在mvc4中仅使用模型中的特定字段?

时间:2013-08-29 12:23:41

标签: c# asp.net-mvc

这是我在MVC4中的模型(或)属性字段

 public class LeaveModel : IModel<LeaveModel>
 {
   public int Id { get; set; }

   public int userId { get; set; }

   public string givenName { get; set; }

   public string shortName { get; set; }

   public string leaveType { get; set; }

   public string leaveDescription { get; set; }

   public string fromDate { get; set; }

   public string toDate { get; set; }

   public int noOfDays { get; set; }

   public string reason { get; set; }

   public string status { get; set; }

   public string statusDescription { get; set; }

   public string createdDate { get; set; }

   public string modifiedDate { get; set; }

   public int leaveTypeId { get; set; }

   public int companyDataId { get; set; }
  }

这是我的添加和更新控制器

   [HttpPost]

   public HttpResponseMessage Post(LeaveModel vm)
   {
       if (ModelState.IsValid)
       {
           HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, Ileave.Add(vm));
           return response;
       }
       else
       {
           return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
       }
   }

  [HttpPut]

   public HttpResponseMessage Put(LeaveModel vm)
   {
       Ileave.Update(vm);
       return Request.CreateResponse(HttpStatusCode.OK);
   }

这是数据库交互代码

    public bool Add(LeaveModel vm)

    {
        try
        {
            vm.createdDate = vm.modifiedDate = DateTime.Now.ToString();
            IDbCommand cmd = Db.GetCommand("sp_LeaveApply", CommandType.StoredProcedure);
            cmd.ParamIn("@LeaveTypeId", vm.leaveTypeId.ToString(), DbType.Int32);
            cmd.ParamIn("@fromDate", vm.fromDate, DbType.String);
            cmd.ParamIn("@toDate", vm.toDate, DbType.String);
            cmd.ParamIn("@noOfDays", vm.noOfDays.ToString(), DbType.Int32);
            cmd.ParamIn("@reason", vm.reason, DbType.String);
            cmd.ParamIn("@createdDate", vm.createdDate, DbType.String);
            cmd.ParamIn("@modifiedDate", vm.modifiedDate, DbType.String);
            Db.OpenConnection();
            int i = cmd.ExecuteNonQuery();
            if (i == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        finally
        {
            Db.CloseConnection();
        }

    }

    public bool Update(LeaveModel vm)
    {
        try
        {
            vm.modifiedDate = DateTime.Now.ToString();
            IDbCommand cmd = Db.GetCommand("sp_LeaveUpdate", CommandType.StoredProcedure);
            cmd.ParamIn("@Id", vm.Id.ToString(), DbType.Int32);
            cmd.ParamIn("@leaveTypeId", vm.leaveTypeId.ToString(), DbType.Int32);
            cmd.ParamIn("@fromDate", vm.fromDate, DbType.String);
            cmd.ParamIn("@toDate", vm.toDate, DbType.String);
            cmd.ParamIn("@noOfDays", vm.noOfDays.ToString(), DbType.Int32);
            cmd.ParamIn("@reason", vm.reason, DbType.String);
            Db.OpenConnection();
            int i = cmd.ExecuteNonQuery();
            if (i == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        finally
        {
            Db.CloseConnection();
        }
    }

在这里看到问题是在添加时我需要所有字段和更新时间我只需要更新某些字段..对于添加和更新我引用 ``相同模型调用(LeaveModel)..所以这里添加很好,但更新时收到错误像DataReaderhas Toomany字段... 我知道为什么会出现这个错误但是如何在更新这个问题时只采取某些字段就是问题..

请帮助

先谢谢

2 个答案:

答案 0 :(得分:1)

我建议你实现一个viewmodel类来帮助你。例如,对于Update,您可以创建一个新类,如下所示:

public class UpdateViewModel
{
    public string givenName { get; set;}
}

public ActionMethod Put()
{
    var original = GetOriginalLeaveModelSomehow();
    var viewModel = new UpdateViewModel();

    viewModel.givenName = original.givenName;
    // The idea is that the viewModel class contains only the fields you want to display to the user.

    return View(viewModel);
}

[HttpPost]
public ActionMethod Put(UpdateViewModel viewModel)
{
    var original = GetOriginalLeaveModelSomehow();

    originalMode.givenName = viewModel.givenName;

    Ileave.Update(original);
}

我不确定上面的代码是否在函数上是正确的,但是使用viewModel类的想法是这里的基本点。它会让您的生活更加轻松,因为您可以更灵活地了解数据如何显示给用户;甚至应显示哪些数据。

答案 1 :(得分:0)

最好的方法是实际拥有两种不同的视图模型。一个用于添加LeaveModels,另一个用于编辑它们。就像那样,编辑模型只能包含您想要编辑的值。