Получение значения guid строки запроса в создание моего контроллера без странностей - PullRequest
0 голосов
/ 03 апреля 2012

ПРИМЕЧАНИЕ: отредактировано для добавления модели

Проблема: значение guid строки запроса приводит меня в соответствие, пытается вставить его в мой контроллер, чтобы я мог создать новую запись с ним в качестве параметра. Самое близкое, что я получил, загружает запись со всеми 0 и тире для guid (что не только неправильно, но выглядит очень странно.)

Это в MVC3 / EF4 с устаревшей базой данных и некоторыми устаревшими страницами и URL-адресами. Приложение, над которым я работаю, включает в себя функцию создания заметок, где пользователь A может делать заметки о пользователе B (например). Оба пользователя имеют свои собственные идентификаторы guid, которые их идентифицируют, а таблица, где хранятся заметки, имеет Столбец Id для самой заметки, а затем два столбца Id, для отслеживания которых используется Пользователь A и Пользователь B для данной конкретной заметки.

Мы всегда можем предположить, что пользователь А является текущим пользователем, и получить его идентификатор таким образом. Один из устаревших URL-адресов - это способ получения идентификатора для пользователя B.

Например: www.mysite.com/notes/user/ED88B0B1-B552-4D63-BD20-C94B837440BE

«Пользователь A» в нашем примере имеет идентификатор ScannerUserId

«Пользователь B» (из строки запроса) имеет идентификатор ScannedCodeId

Вот модель:

public partial class Note
{
    public System.Guid ScannerUserId { get; set; }
    public System.Guid ScannedCodeId { get; set; }
    public System.Guid NoteId { get; set; }
    public string NoteDetail { get; set; }

    public virtual Code Code { get; set; }
    public virtual Contact Contact { get; set; }
}

Вот вид:

@model MySite.Models.Note

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Note</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.NoteDetail)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.NoteDetail)
        @Html.ValidationMessageFor(model => model.NoteDetail)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

А вот раздел контроллера на Create:

public class NoteController : Controller
{
    //
    // GET: /Note/Create

    public ActionResult Create()
    {
        ViewBag.ScannedCodeId = new SelectList(db.Codes, "CodeId", "ScannedCodeId");
        ViewBag.ScannerUserId = new SelectList(db.Contacts, "UserId", "ScannerUserId");
        return View();
    } 
    //
    // POST: /Note/Create

    [HttpPost]
    public ActionResult Create(Note note)
    {
        if (ModelState.IsValid)
        {
            note.NoteId = Guid.NewGuid();
            note.ScannerUserId = (Guid)System.Web.Security.Membership.GetUser().ProviderUserKey;
            //note.ScannedCodeId = new Guid(Request.QueryString[""]);
            note.CreateDate = DateTime.Now;
            note.LastActivityDate = DateTime.Now;
            db.Notes.Add(note);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        ViewBag.ScannedCodeId = new SelectList(db.Codes, "CodeId", "ScannedCodeId", note.ScannedCodeId);
        ViewBag.ScannerUserId = new SelectList(db.Contacts, "UserId", "ScannerUserId", note.ScannerUserId);
        return View(note);
    }

Как я могу получить guid, который находится в строке запроса, в заметку. ScannedCodeId, чтобы db.SaveChanges не взорвал меня?

А также, спасибо, что прочитали это далеко и все, что вы можете сделать, чтобы помочь.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Я полагаю, что Note - это ваш ViewModel. Добавьте к этому свойству WrittenFor

(в этом примере я использую тип данных Int, чтобы сделать этот ответ простым и удобочитаемым. Вы можете заменить его строкой дляВаш уникальный идентификатор / guid)

public class Note
{
  public string NoteDescr { set;get;}
  public int WrittenBy { set;get;}
  public int WrittenFor { set;get;}

}

и в вашем методе get action верните эту модель представления в ваше представление

[HttpGet]
public ActionResult Create(int friendId)
    {
        Note objVm=new Note();
        objVm.WrittenFor=friendId;
        return View(objVm);
    } 

Таким образом, пользователь может получить доступ к этой странице, просматривая как

http://yourdomain/yourcontroller/create/589476

Это означает, что вы (текущее использование в стене (или в записной книжке .. :)) пользователя с идентификатором 589476.

и в вашем представлении, имейте его в форме, используя @Html.HiddenFor HTml вспомогательный метод.Затем, когда вы отправляете свою форму, вы получите ее в своем режиме просмотра, который является параметром вашего метода HttpPost Create

@model Note

@using (Html.BeginForm())
{   
  @Html.TextBoxFor(m=>m.NotDesc)
  @Html.HiddenFor(m => m.WrittenFor)
  <input type="submit" value="Create" />
}

, а в вашем методе действия HttpPost у вас есть то, что вы хотите

[HttpGet]
public ActionResult Create(Note objNote)
{
   int friendId= objNote.WrittenFor 
   string note=objNote.NoteDesc
   //Now you can save your value 
}
0 голосов
/ 03 апреля 2012

Учитывая изменения, необходимые для использования типа Guid вместо типа Int, Shyju дал мне ответ. Спасибо!

...