Ответ 1
В MVC SPA, например angular, вы должны отделять модели от представлений. Я бы предположил, что ваш asp.mvc - это то, где вы обслуживаете свои представления (HTML), и ваш asp.net web api - это то, где вы обслуживаете свои модели (JSON) с помощью операций CRUD.
Ваш контроллер mpc asp.net:
[HttpGet]
public ActionResult Create()
{
return View(); //this return Create.cshtml
}
Ваш контроллер asp.net api:
public class PlanController : ApiController
{
public ThingVM Get()
{
using (var context = new MyContext())
{
var model = new ThingVM();
return model;
}
}
public HttpResponseMessage Post(ThingVM model)
{
HttpResponseMessage response;
//It better to write the modelstate validation as an attribute. See improvement suggestion below
if (ModelState.IsValid)
{
using (var context = new MyContext())
{
var thing = new Thing();
context.Thing.Add(thing);
context.SaveChanges();
response = Request.CreateResponse(HttpStatusCode.Created);
string uri = Url.Link("GetThingById", new {id = thing.Id});
response.Headers.Location = new Uri(uri);
}
}
else
{
response = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return response;
}
}
Ваш контроллер angular, здесь я использую $http
для быстрой демонстрации. В реальном приложении вы можете попробовать angular ресурс для создания клиента REST
app.controller("planController", function ($scope, $http){
$scope.thingVM = $http.get("api/Plan"); //load view model as json from web api
$scope.saveThingVM = function(){
http.post("api/Plan",$scope.thingVM); //send a post request to web api to update
}
});
Ваш Create.cshtml
может быть таким:
<form ng-submit="saveThingVM()" ng-controller="planController">
<input ng-model="thingVM.Name" type="text"></input>
<input type="submit">Save model</input>
</form>
Рекомендация по улучшению:
Проверка модели - это сквозная проблема, лучше написать логику как атрибут для повторного использования логики. Взгляните на мой другой ответ в Как я могу централизовать валидацию modelstate в asp.net mvc с помощью фильтров действий?