Sto imparando .net MVC mentre sto sviluppando una semplice lista di parole - Eg. Quando impari una nuova lingua e crei un elenco di parole correlate a un determinato argomento.
Non penso di seguire le regole o le buone pratiche dell'architettura MVC.
- Non mi sembra giusto passare il modello completo alla vista, che contiene anche dei metodi. Penso che dovrebbero essere solo proprietà. Devo creare un ViewModel o un repository o entrambi?
- I modelli dovrebbero contenere metodi?
- I repository dovrebbero contenere metodi?
- Se i modelli contengono metodi, il repository equivalente non dovrebbe e vice-versa?
- Posso chiamare a catena? Per esempio.
ListModel listModel = new ListModel(); listModel.GetListById(listId).SetOwnerId(222).save();
?
Il mio ListModel.cs :
using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using Dapper;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace WordList.Models
{
public class ListModel : BaseModel
{
public int listId { get; set; }
[Required(ErrorMessage = "Name is required.")]
public string name { get; set; }
[Required(ErrorMessage = "Description is required.")]
public string description { get; set; }
[Required(ErrorMessage = "Language is required.")]
public string language { get; set; }
public int ownerId { get; set; }
public DateTime date_created { get; set; }
public DateTime date_updated { get; set; }
public List<ListModel> GetAllLists()
{
using (MySqlConnection connection = new MySqlConnection(this.connStr))
{
return connection.Query<ListModel>("SELECT * FROM projectx.lists").AsList();
}
}
public ListModel GetListById(int _listId)
{
using (MySqlConnection connection = new MySqlConnection(this.connStr))
{
return connection.Query<ListModel>("SELECT * FROM projectx.lists WHERE listId = @listId",
new {listId = _listId}
).FirstOrDefault();
}
}
}
}
Ecco il mio WordModel.cs :
using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using Dapper;
using System.ComponentModel.DataAnnotations;
namespace WordList.Models
{
public class WordModel : BaseModel
{
public int wordId { get; set; }
public string listId { get; set; }
[Required(ErrorMessage = "word is required.")]
public string word { get; set; }
[Required(ErrorMessage = "Description is required.")]
public string description { get; set; }
public List<WordModel> GetWordsByListId(int _listId)
{
//this.connStr comes from the BaseModel
using (MySqlConnection connection = new MySqlConnection(this.connStr))
{
return connection.Query<WordModel>("SELECT * FROM projectx.words WHERE listId = @listId",
new { listId = _listId }
).AsList();
}
}
}
}
Ecco la mia azione nel controller che richiama il modello:
public ActionResult Index(int listId)
{
ListModel listModel = new ListModel().GetListById(listId);
if (!String.IsNullOrEmpty(listModel.name))
{
ViewData["ListName"] = listModel.name;
ViewData["ListDescription"] = listModel.description;
WordModel wordModel = new WordModel();
return View(wordModel.GetwordsByListId(realId));
}
else
{
ViewData["Message"] = "List doesn't exist";
return View();
}
}