User can add and delete customers
You don't need to enumerate twice here    


var temp = _context.Users.AsEnumerable().ToList();



You can just call .ToList().
SingleOrDefault() also accepts predicates so the first .Where() call is unnecessary, you can just do it like this : 

Your code :        


var temp = _context.Users.Where(x =&gt; x.id == id).SingleOrDefault();



Can become :

var temp = _context.Users.SingleOrDefault(x =&gt; x.id == id);

I don't see any reason to call .ToList() here :


    var temp = _context.Users.ToList();
    if (temp.Any(x =&gt; x.name == name))
    {
        ViewBag.NotUnique = true;
        return RedirectToAction("Customers");
    }



You are not performing any List&lt;T&gt; specific operations, (I assume Users is  IEnumerable&lt;T&gt;), you are good with a pure IEnumerable&lt;T&gt; here. In fact, you don't even need the temp variable, you can just directly access _context.Users.
You can have just ActionResult instead of IActionResult as a return type for your methods.


Design


Usually asp.net-mvc projects work with multiple DTO's (Data Transfer Object), which are almost identical to your actual model, but you can remove some things and add others, so that you can define the way your data will be passed around your application. Often the ViewModel is mapped in a way to it's respective DTO, to ease the creation of both objects.

Even tho simple projects probably wont need any additional DTO's.
Your models should have  proper validation instead of some check against null in your controller, which should only verify that the validation is successful. For example DataAnnotations offers quite some variety of pre-written validation attributes. You can of course extend this with your own, but it already has the core things you might need. You can find examples here