0

名前付きのオブジェクトがあり、ユーザーがオブジェクトプロパティを編集できるかどうかを指定するためにVisit、次のhelper method(「CanBeEdited」)を定義しました。-Status

public partial class Visit 
    {
        public bool CanBeEdited(string username)
        {return (((DoctorID != null) && (DoctorID.ToUpper().Equals(username.ToUpper()))) && (StatusID == 5));       }     }}

次に、天気に応じdropdownlistてビューに特定の表示または非表示を指定しました。ヘルパーメソッドはtrueまたはfalseを返します(trueを返す場合、ユーザーはを表示および編集できます。falseを返す場合、ビューは古い表現をレンダリングします。ステータス値)。EditCanBeEditedStatus dropdownlist@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>
}

正直なところ、ケースなどを実装するのは初めてなので、私のアプローチは有効ですか???、または私が気付いていないいくつかの弱点がありますか?? 。Webアプリケーション全体に同様のケースを実装する必要があるため...

アクションメソッドのCanBeEditedもチェックしていることを念頭に置いてください。

助けてくれてありがとう。

更新:- 私の投稿アクションメソッドは次のようになります:-

 [HttpPost]
        public ActionResult Edit(Visit visit)
        {
            if (!(visit.Editable(User.Identity.Name)))
            {
                return View("NotFound");
            }
            try
            {
                if (ModelState.IsValid)
                {
                    repository.UpdateVisit(visit);
                    repository.Save();
                    return RedirectToAction("Index");
                }
            }
            catch (DbUpdateConcurrencyException ex)
            {
                var entry = ex.Entries.Single();
                var clientValues = (Visit)entry.Entity;

                ModelState.AddModelError(string.Empty, "The record you attempted to edit "
                + "was modified by another user after you got the original value. The "
                + "edit operation was canceled and the current values in the database "
                + "have been displayed. If you still want to edit this record, click "
                + "the Save button again. Otherwise click the Back to List hyperlink.");
                //   patient.timestamp = databaseValues.timestamp;
            }

            catch (DataException)
            {
                //Log the error (add a variable name after Exception)
                ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator.");
            }
            ViewBag.DoctorID = new SelectList(Membership.GetAllUsers(), "Username", "Username", visit.DoctorID);
            ViewBag.StatusID = new SelectList(db.VisitStatus, "StatusID", "Description", visit.StatusID);
            ViewBag.VisitTypeID = new SelectList(db.VisitTypes, "VisitTypeID", "Description", visit.VisitTypeID);
            return View(visit);
        }
4

2 に答える 2

1

ビューにそれを追加するのは良い考えではないと思います。My ViewModel にブール型のプロパティを保持させて、編集可能かどうかを判断したいと思います。関連する権限を確認した後、コントローラーで設定できる値。

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
}
于 2012-04-26T03:03:13.693 に答える
0

私見、それは十分に有効に聞こえます。

更新: 無関係なコメントを削除し、主要な懸念事項を示すために編集しました。

ここで、特にコントローラー アクションを詳しく見てみると、非表示のフィールドを削除することを強くお勧めします (バックエンドからレコードを再ロードする必要があるフィールドを除く)。

知識のあるユーザーは非表示のフォーム データ (すべてのフォーム データ) を改ざんすることができ、コントローラ アクションは喜んでそのすべてをサーバーに送り返します。

実際には、変更が許可されているフィールドのみをポストバックし、バックエンドからレコードを復元し、「編集可能な」フィールドを新しいコピーに転送する必要があります。これにより、同時編集や古いレコードの問題への対処にも近づきます。

于 2012-04-26T02:52:49.550 に答える