我有我的模特
public class Post
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
}
public class Photo
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Source { get; set; }
}
public class PhotoAttach
{
[Key]
public int Id { get; set; }
public virtual Post Post { get; set; }
public virtual Photo Photo { get; set; }
public bool IsThumbnail { get; set; }
}
在我的CreatePost
视图中,我希望用户能够选择要附加到创建帖子的一些现有照片。我使用一些脚本创建了这个,所以当用户单击提交按钮时,我已经有一个JSON对象,其中包含将要附加的所有照片ID。
但是此视图使用Post
作为模型。那么如何从控制器中引用这个对象呢?
我将它转换为字符串并添加一些隐藏的输入。但是可以从控制器访问它吗?
如果不创建新的视图模型,有没有办法做到这一点?
答案 0 :(得分:3)
如果您不想创建新的视图模型,可以向HttpPost操作方法添加新参数以接受文件ID的集合。
[HttpPost]
public ActionResult CreatePost(Post model,IEnumerable<int> fileIds)
{
// you can loop through fileIds colleciton
return Json(new { status="success"});
}
假设您发送数据的ajax代码包含fileIds
属性,该属性是您的文件ID的数组。
$(function () {
$("yourFormId").submit(function (e) {
e.preventDefault();
var fileIdsToSend= [345, 56, 234]; //Array of Id's you want to send
var _f = $(this);
var data = {
Title: $("#Title").val(),
Description :$("#Description").val(),
fileIds: fileIdsToSend
};
$.post(_f.attr("action"),data, function (response) {
// do something with the response
});
});
});
理想的解决方案是使用特定于视图的视图模型,而不是将实体模型用作视图模型。
public class CreatePostVm
{
public string Title {set;get;}
public string Description {set;get;}
public IEnumerable<int> FileIds {set;get;}
}
你的HttpPost动作将接受这个
的对象[HttpPost]
public ActionResult CreatePost(CreatePostVm model)
{
// do something and return something
}
上面的jquery代码也适用于将数据发送到此版本的action方法。
答案 1 :(得分:2)
是的,这是可能的。 你的行动结果是这样的
public ActionResult AddProductToCart_Details(Post post, FormCollection form)
您可以在html中以隐藏名称保存值。
<input id="formCheck" type="checkbox" name="xxxx" />
并获得这样的价值。
var day = form["XXXX"];
答案 2 :(得分:1)
var PhootoIdList = GetAllYourPhotoIds;
var PostModel = {
Title : GetTitle,
Description : GetDescription
};
$.ajax({
url: '/mycontroller/action',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
photoIds: PhotoIdList,
model: {
Post: PostModel
}
}),
success: function(result) {
}
});
没有Ajax
@using(Html.BeginForm("Create", "Posts", FormMethod.Post, null) )
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Post</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
</div>
</div>
<select name="photoIds" id="photoIds" multiple>
<option value="AAAA">Photo 1</option>
<option value="BBBB">Photo 2</option>
<option value="CCCC">Photo 3</option>
</select>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Title,Description")] Post post, string[] photoIds)
{
if (ModelState.IsValid)
{
db.Posts.Add(post);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}