注意:已编辑添加模型
问题:查询字符串guid值让我适合,试图将它放入我的控制器中,以便我可以创建一个新记录作为参数。到目前为止,我最接近的是加载一个记录,所有0和破折号为guid(这不仅错误,但看起来很奇怪。)
这是MVC3 / EF4中的遗留数据库和一些遗留页面和URL。我正在处理的应用程序包括笔记记录功能,其中用户A可以记录关于用户B的信息(例如)。两个用户都有自己的guid ID来识别它们,并且存储笔记的表有一个注释本身的Id列,然后是两个Id列,用于跟踪用户A和用户B的特定注释。
我们总是可以假设用户A是当前用户,并以这种方式获得他的ID。其中一个遗留URL是如何获得用户B的ID。
例如: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放入note.ScannedCodeId,以便db.SaveChanges不会爆炸?
另外,感谢您阅读这篇文章以及您可以做的任何事情来帮助您。
答案 0 :(得分:1)
我相信Note是您的ViewModel。为该
添加WrittenFor
属性
(我在这个例子中使用Int数据类型来保持这个答案简单易读。你可以用你的唯一id / 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
这意味着你(当前用途在墙上(或笔记本... :))的用户ID为589476。
并在您的视图中,使用@ Html.HiddenFor HTml帮助方法将其包含在表单中。然后,当您提交表单时,您将在viewmode中获取它,这是您的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
}
答案 1 :(得分:0)
允许使用类型Guid而不是Int类型所需的更改,Shyju给了我答案。谢谢!