Asp.net mvc 3 使用助手方法在我的razor视图中查看或隐藏dropdownlist

Asp.net mvc 3 使用助手方法在我的razor视图中查看或隐藏dropdownlist,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,我有一个名为Visit的对象,我定义了以下helper方法(“canbeedid”),以指定用户是否可以编辑对象状态属性:- public partial class Visit { public bool CanBeEdited(string username) {return (((DoctorID != null) && (DoctorID.ToUpper().Equals(username.ToUpper()))) &&a

我有一个名为
Visit
的对象,我定义了以下
helper方法
(“canbeedid”),以指定用户是否可以编辑对象
状态
属性:-

public partial class Visit 
    {
        public bool CanBeEdited(string username)
        {return (((DoctorID != null) && (DoctorID.ToUpper().Equals(username.ToUpper()))) && (StatusID == 5));       }     }}
然后,我已指定在我的
Edit
视图上显示或隐藏某些
dropdownlist
,具体取决于
canbeedid
helper方法是否返回true(如果返回true,则用户可以查看和编辑
状态下拉列表
,如果返回false,则视图将呈现表示旧状态值的
@Html.HiddenFor

包含帮助器方法的“我的编辑”视图如下所示:-

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Visit</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Note)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Note)
            @Html.ValidationMessageFor(model => model.Note)
        </div>


        <div class="editor-label">
            @Html.LabelFor(model => model.DoctorID)
        </div>
        <div class="editor-field">
            @Html.DropDownList("DoctorID", String.Empty)
            @Html.ValidationMessageFor(model => model.DoctorID)
        </div>

        @{
       if (Model.CanBeEdited(Context.User.Identity.Name))
       {
        <div class="editor-label">
            @Html.LabelFor(model => model.StatusID)
        </div>
        <div class="editor-field">
            @Html.DropDownList("StatusID", String.Empty)
            @Html.ValidationMessageFor(model => model.StatusID)
        </div>
       }
       else
       {
       @Html.HiddenFor(model => model.StatusID)}
}
        <p>
          @Html.HiddenFor(model => model.VisitTypeID)
          @Html.HiddenFor(model => model.CreatedBy)
          @Html.HiddenFor(model => model.Date)
          @Html.HiddenFor(model => model.VisitID)
          @Html.HiddenFor(model => model.PatientID)
          @Html.HiddenFor(model => model.timestamp)

        <input type="submit" value="Create" />

        </p>
    </fieldset>
}

听起来很有道理

更新:删除不相关的评论,并进行编辑以表明主要关注点

现在,仔细看看,尤其是控制器操作,我强烈建议您消除隐藏字段(需要从后端重新加载记录的字段除外)

精明的用户可以篡改隐藏的表单数据(所有表单数据),您的控制器操作将很高兴地将其全部发送回服务器


实际上,您应该只回发允许更改的字段,从后端重新水化记录,并传输“可编辑”字段将字段添加到新副本。这也更接近于解决并发编辑和过时记录问题。

我觉得在视图中添加该字段不是一个好主意。我希望我的ViewModel保存布尔类型的属性,以确定其是否可编辑。在检查releva后,可以在控制器中设置该属性的值nt权限

public class ProductViewModel
{
  public bool IsEditable { set;get;}
  //other relevant properties
}
和控制器动作

public ActionResult GetProduct()
{
  ProductViewModel objVM=new ProductViewModel();
  objVm.IsEditable=CheckPermissions();

}
private bool CheckPermissions()
{
  //Check the conditions and return true or false;
}
所以风景会像这样干净

@if (Model.IsEditable)
{
  //Markup for editable region
}

感谢您的回复,实际上helper方法是在对象模型类(在我的例子中是Visit partial类)中定义的,我在我的视图和控制器操作方法上重用了helper方法..但是…我可能会建议不要在隐藏字段中公开status字段,这会打开它进行表单黑客攻击。我的意思是,如果他们不能编辑它,你可能不需要在表单帖子中使用它,对吗?但是因为我正在将一个对象传递给我的编辑操作方法,所以,不要如果我没有在隐藏字段中添加状态,那么该值将为空。不是真的,,,如果helper方法返回true,那么用户应该能够编辑状态…我修改了我的答案以解决我对隐藏字段的担忧。但是我认为在我的情况下使用viewmodel不会与我当前的Pos实现一起工作t编辑操作方法。(我更新了原始问题以包含操作方法的代码)
@if (Model.IsEditable)
{
  //Markup for editable region
}